我正在尝试使用 Eclipse、Buildship、Gradle 来开发 java 9 应用程序。
日食:氧气 建造:2.2.0 摇篮:4.3.1
我正在寻找一种方法来告诉 Buildship/Gradle 将 项目和外部依赖项添加到 Modulepath 而不是 Classpath。
这是我在配置 Eclipse 项目时看到的内容 Java 构建路径。
Properties for TestMain
Java Build path
Source | Projects | Libraries | Order and Export
---------
Modulepath
- JRE System Library [JavaSe-9]
Classpath
- Project and External Dependencies
- Access rules: No rules defined
- External annotations: (None)
- Native library location: (None)
- coreutil-9.4.1.jar
- slf4j-api-1.7.2.1.jar
- ...
当我尝试在 module-info.java 中引用自动模块 coreutil 时,我收到错误 coreutil 无法解析为模块。
如果我手动将 coreutil-9.4.1.jar 添加到 Modulepath 中,则 coreutil 模块将变得可见。然而,这是一个问题,因为在某些情况下手动添加 60 多个库是不切实际的。此外,每次我刷新 Gradle 项目时,它们都会从 Modulepath 中删除。
感谢您的帮助。
盖坦
与 gradle 的 Donát Csikós 交谈后(感谢 Donát),将以下内容添加到 build.gradle 文件中解决了问题:
apply plugin: 'eclipse'
eclipse.classpath.file {
whenMerged {
entries.findAll { isModule(it) }.each { it.entryAttributes['module'] = 'true' }
}
}
boolean isModule(entry) {
// filter java 9 modules
entry.kind == 'lib' // Only libraries can be modules
}
这是一个更通用的解决方案,其中所有libraries和projects依赖项都添加到Eclipse的模块路径中:
apply plugin: 'eclipse'
eclipse.classpath.file {
whenMerged {
entries.findAll { isModule(it) }.each { it.entryAttributes['module'] = 'true' }
}
}
boolean isModule(entry) {
return (entry instanceof org.gradle.plugins.ide.eclipse.model.ProjectDependency) ||
(entry instanceof org.gradle.plugins.ide.eclipse.model.Library)
}