我寻找答案。我没有找到好的解决办法。
根据this https://stackoverflow.com/questions/56979359/gradle-cannot-resolve-package-for-java-11-module-when-in-one-of-two-directories看来Groovy目前还没有真正兼容Java模块。这是因为某些包包含在库的多个 jar 中(与模块不兼容)。您必须等待 Groovy 4 才能获得兼容版本。
我发现 JavaFX 插件使用这个插件 https://github.com/java9-modularity/gradle-modules-plugin内部。这个插件似乎认为所有依赖项都是模块(这不是默认的 Gradle 行为)。
为了使您的应用程序正常工作,您似乎必须:
- 强制 Gradle 将 Groovy 放入类路径而不是模块路径中(它不会被视为模块,但如果使用 javafx 插件似乎不可能)
- 使用“补丁模块”系统:它允许 Gradle 将库 jar 融合到单个模块中,以防止包位于不同 jar 中的问题
我用 IDEA(项目结构/库)搜索了 Groovy jar,并尝试使用插件提供的语法来使用“补丁模块”:
patchModules.config = [
"org.codehaus.groovy=groovy-ant-3.0.1.jar",
"org.codehaus.groovy=groovy-cli-picocli-3.0.1.jar",
"org.codehaus.groovy=groovy-console-3.0.1.jar",
"org.codehaus.groovy=groovy-datetime-3.0.1.jar",
"org.codehaus.groovy=groovy-docgenerator-3.0.1.jar",
"org.codehaus.groovy=groovy-groovydoc-3.0.1.jar",
"org.codehaus.groovy=groovy-groovysh-3.0.1.jar",
"org.codehaus.groovy=groovy-jmx-3.0.1.jar",
"org.codehaus.groovy=groovy-json-3.0.1.jar",
"org.codehaus.groovy=groovy-jsr-3.0.1.jar",
"org.codehaus.groovy=groovy-macro-3.0.1.jar",
"org.codehaus.groovy=groovy-nio-3.0.1.jar",
"org.codehaus.groovy=groovy-servlet-3.0.1.jar",
"org.codehaus.groovy=groovy-sql-3.0.1.jar",
"org.codehaus.groovy=groovy-swing-3.0.1.jar",
"org.codehaus.groovy=groovy-templates-3.0.1.jar",
"org.codehaus.groovy=groovy-test-junit-3.0.1.jar",
"org.codehaus.groovy=groovy-test-3.0.1.jar",
"org.codehaus.groovy=groovy-testng-3.0.1.jar",
"org.codehaus.groovy=groovy-xml-3.0.1.jar"
]
它仅适用于单行“org.codehaus.groovy=X.jar”,但一个错误阻止它与所有库 jar 一起使用(查看这个问题 https://github.com/java9-modularity/gradle-modules-plugin/issues/93在 Github 上)。
所以你有多种选择:
- 使用 Java 而不是 Groovy
- 等待新的 Groovy 版本,或新版本的插件(模块插件,以及内部使用该插件的 javafx-plugin 版本)
- 使用旧的 javafx 配置:默认情况下依赖项不是模块,您必须在 build.gradle 中手动指定 JavaFX 依赖项应被视为模块(检查我对这个问题的“过时”答案 https://stackoverflow.com/a/52615808/595305)