2017-10-28 124 views
4

我想從Java 8遷移到Java 9.當運行我的測試時,我得到一個關於javax.xml.bind.JAXBContext的CNFE。因此,「--add-modules java.xml.bind」似乎是必需的。我試圖擴展我的GRADLE_OPTS env變量,但錯誤依然存在。任何暗示是讚賞。JUnit 5,Java 9和Gradle:如何傳遞--add-modules?

+0

你看看[如何表達對Java EE的功能過渡Maven中依賴於Java的9 ?](https://stackoverflow.com/questions/46084751/how-to-express-dependency-in-maven-on-java-ee-features-for-transition-to-java-9/46086920#46086920)?請你詳細說明你的設置。 – nullpointer

+0

這是運行時失敗,而不是編譯問題。我使用Kotlin(不是Java)和Spring Boot。 @nullpointer:這是否意味着我只需要修改答案的第二部分? –

+0

是的,只是測試執行階段,在這種情況下,應該是您所需的更改。 – nullpointer

回答

2

據艾倫·貝特曼,我添加了以下行build.gradle,使gradle bootRun也可以工作:

runtime('org.glassfish.jaxb:jaxb-runtime:2.3.0', 'javax.activation:activation:1.1.1') 
4

您可以按照在遷移作爲gradle-building java9 modules說這是五個基本步驟: -

當轉換一個Java庫項目產生的Java 9模塊, 您也應五個轉變到讓你的項目。

  • 添加描述該模塊的module-info.java

  • 修改compileJava任務以生成模塊。

  • 修改compileTestJava任務以本地更改模塊。

  • 修改test任務以使用本地更改的模塊。

  • (可選)爲所有其他項目添加Automatic-Module-Name清單條目。


在你的使用情況,您需要確保

compileTestJava { 
    inputs.property("moduleName", moduleName) 
    doFirst { 
     options.compilerArgs = [ 
      '--module-path', classpath.asPath, 
      '--add-modules', 'org.junit.jupiter.api', // junit5 automatic module specific 
      '--add-modules', 'java.xml.bind' // jaxb specific 
      '--add-reads', "$moduleName=org.junit.jupiter.api", // allow junit to read your module 
      '--patch-module', "$moduleName=" + files(sourceSets.test.java.srcDirs).asPath, // add test source files to your module 

     ] 
     classpath = files() 
    } 
} 

,然後執行測試,你就不需要UDPATE的test任務,

test { 
    inputs.property("moduleName", moduleName) 
    doFirst { 
     jvmArgs = [ 
      '--module-path', classpath.asPath, 
      '--add-modules', 'ALL-MODULE-PATH', // to resolve all module in the module path to be accessed by gradle test runner 
      '--add-reads', "$moduleName=org.junit.jupiter.api", 
      '--patch-module', "$moduleName=" + files(sourceSets.test.java.outputDir).asPath, 
     ] 
     classpath = files() 
    } 
} 

備註:對於長期的解決方案,雖然我也建議你也遵循this answer中提到的重點。