JUnit 5、Java 9 和 Gradle:如何传递 --add-modules?

JUnit 5, Java 9 and Gradle: How to pass --add-modules?

我想从 Java 8 迁移到 Java 9。当 运行 我的测试时,我得到一个关于 javax.xml.bind.JAXBContext 的 CNFE。因此,似乎需要“--add-modules java.xml.bind”。我试图扩展我的 GRADLE_OPTS 环境变量,但错误仍然存​​在。任何提示表示赞赏。

您可以按照 gradle-building java9 modules 中所述的五个基本步骤进行迁移,它们是:-

When converting a java-library project to produce a Java 9 module, there are five changes you should to make to your project.

  • Add a module-info.java describing the module.

  • Modify the compileJava task to produce a module.

  • Modify the compileTestJava task to locally alter the module.

  • Modify the test task to consume the locally altered module.

  • (Optional) Add Automatic-Module-Name manifest entries for all other projects.


在您的用例中,您需要确保

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()
    }
}

然后为了执行测试,您不需要将 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 中提到的要点还有。

根据 Alan Bateman 的说法,我将以下几行添加到 build.gradle 以便 gradle bootRun 也可以工作:

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