gradle - 将 Groovy 应用程序和测试代码与 jlink 解决方案结合使用来捆绑 JavaFX

标签 gradle javafx groovy module jlink

这是从this excellent solution开始的如何让 Gradle 将 JavaFX 与您的发行版捆绑在一起的问题。

NB 规范:Linux Mint 18.3、Java 11、JavaFX 13。

那些涉及 jlink 和 module-info.java 的东西超出了我的工资等级(尽管我正在努力阅读这些东西)。

我想在我的应用程序和测试代码(即 Spock)中使用 Groovy,而不是 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 东西正在注入(inject)一些 Groovy 依赖项。好吧,我可以接受(尽管很高兴知道它是什么版本的 Groovy)。

问题是,即使我省略了 Groovy 依赖行,当我尝试引入 Spock 依赖项时也会出现相同的错误:

testImplementation 'org.spockframework:spock-core:1.2-groovy-2.5'

有人知道这里发生了什么以及该怎么办吗?

最佳答案

我寻找答案。我没有找到好的解决办法。

根据this看来Groovy目前还没有真正兼容Java模块。这是因为某些包包含在库的多个 jar 中(与模块不兼容)。您必须等待 Groovy 4 才能获得兼容版本。

我发现JavaFX插件使用this plugin内部。这个插件似乎认为所有依赖项都是模块(这不是默认的 Gradle 行为)。

为了使您的应用程序正常运行,您似乎必须:

  • 强制 Gradle 将 Groovy 放入类路径而不是模块路径中(它不会被视为模块,但如果使用 javafx 插件似乎不可能)
  • 使用“补丁模块”系统:它允许 Gradle 将库 jar 融合到单个模块中,以防止包位于不同 jar 中的问题

我用 IDEA(项目结构/库)搜索了 Groovy jar,并尝试使用插件提供的语法来使用“patch-module”:

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 上的 this issue)。

所以你有多种选择:

  • 使用 Java 而不是 Groovy
  • 等待新的 Groovy 版本或新版本的插件(modules-plugin 以及内部使用该插件的 javafx-plugin 版本)
  • 使用旧的 javafx 配置:默认情况下依赖项不是模块,您必须在 build.gradle 中手动指定 JavaFX 依赖项应被视为模块(检查 my "obsolete" answer to this question )

关于gradle - 将 Groovy 应用程序和测试代码与 jlink 解决方案结合使用来捆绑 JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60569904/

相关文章:

android - gradle无法找到generateDensities属性

javafx - 为什么start()会抛出异常?

maven - 在 Maven (pom.xml) 和 Gradle (build.gradle) 之间共享依赖版本

java - 来自 javafx 场景的回调事件

JavaFX 修改每列的 TableView 标题对齐方式

chalice : Generating PDF from GSP

file - 如何在groovy中提取文件属性?

azure - 在 groovy 脚本中访问 Azure 管道构建信息

eclipse - gradle项目导入失败

android-studio - 如何修复gradle版本的错误循环?