Java Platform Module系统允许在模块路径和类路径上添加依赖项:
java --add-modules java.sql \
--add-opens java.base/java.lang=javassist \
-p mytarget/lib-direct:mytarget/cqrs.jar \
-cp "mytarget/lib/*" \
-m com.iluwatar.cqrs/com.iluwatar.cqrs.app.App
在使用Java模块的Gradle指南中,展示了如何将类路径中的所有内容转换为匿名模块:
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
当依赖项不符合JPMS限制(例如禁止拆分包)时,这可能不适用。
我尝试通过明确说明这一点来强制使用类路径,但它没有帮助:
compileJava {
doFirst {
options.compilerArgs = [
'-cp', classpath.asPath
]
}
}
问题可以在这里复制:https://github.com/experimental-software/jpms-gradle
此项目的构建将导致编译失败,因为外部依赖项未包含在module-info.java
文件中。那些编译失败可以通过添加require
语句和不同依赖项的自动模块名称来解决(例如使用IntelliJ的自动辅助),如下所示:
module billing {
requires spring.context;
exports com.experimental.billing.api;
}
但是,由于JPMS限制,编译将在稍后的步骤中失败:
Error:java: the unnamed module reads package javax.transaction from both javax.transaction.api and jboss.transaction.api.1.2.spec
是否可以仅将模块路径用于项目内部子模块的依赖项以及所有外部依赖项的类路径? 如果是,那么如何使用Gradle完成?