Java 模块路径和类路径与Gradle的组合

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平台模块系统允许在模块路径和类路径上添加依赖项:

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专家)。