Java 模块路径和类路径与Gradle的组合
Java平台模块系统允许在模块路径和类路径上添加依赖项:Java 模块路径和类路径与Gradle的组合,java,gradle,java-9,Java,Gradle,Java 9,Java平台模块系统允许在模块路径和类路径上添加依赖项: 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模块的
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
]
}
}
此问题可在此处重现:
此项目的生成将导致编译失败,因为模块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做到这一点?当我尝试构建
jpms Gradle
项目时,我得到以下错误:错误:包org.springframework.stereotype不存在:import org.springframework.stereotype.Service代码>。这是预期的吗?这是问题的一部分吗?我的感觉是它不是。@MichaelEaster是的,有了这个编译错误,我试图证明我试图解决的问题。我已经更新了问题描述以澄清这一点。请阅读GitHub link.AFAIK下面的段落,Gradle总是将所有依赖项(直接的和可传递的)放在模块路径上。这不是最优的,但我不知道有什么方法可以改变这一点(尽管我不是一个Gradle专家)。