gradle - 使用 Groovy 应用和测试代码结合 jlink 解决方案来捆绑 JavaFX
问题描述
这是关于如何让 Gradle 将 JavaFX 与您的发行版捆绑在一起的问题的出色解决方案。
注意:Linux Mint 18.3、Java 11、JavaFX 13。
那些涉及 jlink 和 module-info.java 的东西超出了我的工资等级(尽管我正在努力阅读这些东西)。
我想在我的应用程序中使用 Groovy 并测试代码(即 Spock)而不是 Java。问题是,我在 build.gradle 中包含“正常”依赖项的那一刻,即
implementation 'org.codehaus.groovy:groovy-all:2.5.9'
并尝试构建,我收到多个错误:
mike@M17A ~/IdeaProjects/TestProj $ ./gradlew build
> Configure project :
Found module name 'javafx.jlink.example.main'
> Task :compileTestJava FAILED
error: the unnamed module reads package org.codehaus.groovy.tools.shell.util from both org.codehaus.groovy.groovysh and org.codehaus.groovy
[...]
error: the unnamed module reads package groovy.xml from both org.codehaus.groovy and org.codehaus.groovy.xml
[...]
error: module org.codehaus.groovy.ant reads package groovy.lang from both org.codehaus.groovy and org.codehaus.groovy.test
error: module org.codehaus.groovy.ant reads package groovy.util from both org.codehaus.groovy.xml and org.codehaus.groovy.ant
100 errors
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':compileTestJava'.
是的,100 个错误……可能更多!通过注释掉各种事情,我认为我得出的结论是 jlink 的东西正在注入一些 Groovy 依赖项。好吧,我可以忍受(尽管很高兴知道它是什么版本的 Groovy)。
麻烦的是,即使我省略了 Groovy 依赖行,当我尝试引入 Spock 依赖时也会出现同样的错误:
testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'
有没有人知道这里发生了什么以及如何处理它?
解决方案
我搜索了一个答案。我没有找到好的解决方案。
据此,Groovy目前似乎与 Java 模块并不真正兼容。这是因为某些包包含在库的多个 jar 中(与模块不兼容)。您将不得不等待 Groovy 4 的兼容版本。
我发现 JavaFX 插件在内部使用了这个插件。这个插件似乎认为所有的依赖都是模块(它不是默认的 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(查看 Github 上的这个问题)。
所以你有多种选择:
- 使用 Java 而不是 Groovy
- 等待新的 Groovy 版本或新版本的插件(modules-plugin,以及在内部使用这个的 javafx-plugin 版本)
- 使用旧的 javafx 配置:默认情况下依赖项不是模块,您必须在 build.gradle 中手动指定 JavaFX 依赖项应被视为模块(查看我对此问题的“过时”答案)
推荐阅读
- java - 如何解压二维数组?
- typescript - TypeScript 至少需要一个属性
- python - 尽管安装了所有先决条件,TensorFlow 并未使用 GPU
- gradle-kotlin-dsl - 在 gradle kts 项目中使用 buildSrc 跨子项目共享类型化变量
- linux - mac 终端命令输出在结尾“%”处给出特殊字符
- git - 身份验证问题 Argo CD 与 Azure DevOps Server 2020 - Git Repo
- matlab - 输入数据大小与 net.inputs 大小不匹配
- linux - 安装在 Linux OL8 上的 Tomcat 和 Apex 上时 Oracle ORDS 的正确位置
- apple-push-notifications - 如何使用新的 APNS HTTP2 流程让 Apple Pass 更新正常工作?
- flutter - 颤振等待未来按钮点击被忽略