編輯:本javaee-endorsed-api
上述做法可能會正常工作,但它讓我心驚肉跳。我認爲它不再被生產或維護。此外,其中包含的pom.xml
反映了它在某個時候被稱爲javaee-compact-api
,您可以看到它們如何從中除去實現類。相比之下,櫻桃採摘您要使用的API罐作爲認可(如我下面推薦)似乎更加穩定和靈活。最後,如果您仍然想要使用javaee-endorsed-api
方法,則仍然可以使用我推薦的一般方法,並指向javaee-endorsed-api.jar
。
Ryan;我只是在同一旅程中梳理了這段長篇小說(涉及StackOverflow,java.net論壇等)。如您所知,在設備或集成測試期間,您需要設置java.endorsed.dirs
系統屬性。
訣竅是你必須這樣做,運行測試的JVM纔會啓動它。這取決於你如何運行Surefire。
如果由於某種原因您將Surefire設置爲而不是 fork,這可能是一件壞事,您應該在此重新評估您的配置。
如果你有神火集到餐桌,那麼你可能會認爲你可以簡單地包括在systemPropertyVariables
節java.endorsed.dirs
,像這樣:
<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>
...但這是錯誤的。原因在於,實際運行的程序是ForkedBooter
,ForkedBooter
以編程方式爲單元測試設置系統屬性。也就是說,當你的<systemPropertyVariables>
節被ForkedBooter
讀取時,它已經太晚了。
但是你可以在您神火配置中使用<argLine>
這樣的:
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>
現在的VM神火叉將有適當地設置其核準目錄。現在我們來談談要提供什麼價值。
你想櫻桃選擇重寫的API。在你的情況下,javax.annotation.*
是一個合法的選擇。您想要在本地Maven存儲庫中提供相關jar的目錄。
這裏是我使用的值:
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}
一旦你做到了這一切,那麼當神火叉一個虛擬機來運行單元測試,獲得覈準的目錄將被設置爲你的本地倉庫目錄包含容納javax.annotation
類的jar,現在它運行在進程—嵌入式GlassFish中—將使用javax.annotation
類,而不是Java SE 6的版本的Java EE 6的版本。我希望這能夠幫到你。
你說的是(IMO)它應該工作的方式,但Java SE中認可庫的舊版本在加載時贏得'第一次匹配'場景..我想。啓動JVM的人需要設置java.endorsed.dirs,但對於某些嵌入式容器來說很困難。對於Glassfish Embedded,一切都在一個大的JAR中,我認爲認可的庫不保證位於特定的位置。我開始的[線程的Arquillian(http://community.jboss.org/thread/168521?tstart=0),看看他們的想法。我添加了一個[Glassfish的錯誤(http://java.net/jira/browse/EMBEDDED_GLASSFISH-131)。 –
@Ryan J.我只是看看你的bug報告,它確實是可重現的。這應該由GlassFish團隊根據我以前的帖子的精神修復,但在他們能夠解決此問題之前,請通過一些快速解決方法: 1.使用Main Class啓動服務器。 2.切換到其他嵌入式容器。 3.設置贊同庫使用MAVEN_OPTS(uggly,但將讓你立刻去......)。 –