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')
我想从 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')