2017-10-28 127 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中提到的重点。