我跟着Gradle guide on building Java 9 modules开始了一个简单的基于Java 9的库项目。特别是我按照指南中的建议手动设置模块路径,如下所示:
ext.moduleName = 'com.foo.bar'
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files()
}
}
观察这只是我的整个类路径,由Gradle从我的依赖图中确定,并将其移到模块路径上。
除了一个简单的问题外,一切都很有效。我的一些依赖项(例如 org.jetbrains.kotlin:kotlin-stdlib-1.2.10
)不是真正的Java 9模块,因为它们缺少module-info.class
。可以将它们粘贴在类路径或模块路径上,因为,现在,java
会将它们转换为所谓的automatic modules。
问题出现了,因为即使对于自动模块,如果它在我的模块路径上,我需要在我的项目模块中的requires
指令中引用它。 但是因为我使用-Xlint:all
选项滚动到Java编译器,javac
会生成以下警告:
/path/to/myproject/foo-module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
requires kotlin.stdlib;
^
这个警告对我来说是站不住脚的,因为我还使用了-Werror
javac
标志,因此它使我的构建失败。
所以我似乎需要将自动模块推送到我的类路径中,并且只在模块路径上保持“真正的”模块依赖...
是否有任何通用或半通用方式(即未与依赖项名称耦合)来分离编译器类路径与其模块路径之间的依赖关系?