是啥让 Maven 想要使用 Zulu Java 11 的 openjfx 而不是 Zulu Java 8 用于 Spring Boot 项目?

Posted

技术标签:

【中文标题】是啥让 Maven 想要使用 Zulu Java 11 的 openjfx 而不是 Zulu Java 8 用于 Spring Boot 项目?【英文标题】:What makes Maven want openjfx with Zulu Java 11 and not Zulu Java 8 for a Spring Boot project?是什么让 Maven 想要使用 Zulu Java 11 的 openjfx 而不是 Zulu Java 8 用于 Spring Boot 项目? 【发布时间】:2019-05-18 23:42:59 【问题描述】:

我继承了一个 Spring Boot 项目,我们希望使用 Java 11 进行测试,因为 Java 9 和 10(varList.of(...))中添加了一些不错的功能。

Maven 项目分为几个部分,其中为 Java 8 设置生产代码,为 Java 11 设置测试代码。这在模块基础上单独运行良好,全局构建适用于 Java 8(除了测试无法编译)和 Java 10。

现在我想使用 Java 11 从根目录编译所有内容,因为这是 LTS(Zulu,因为这是在 Windows 10 上),出于某种原因,Maven 现在想要加入 org.openjfx:javafx.base:jar:11.0.0-SNAPSHOT

[INFO] Building mumble-data-service-parent 1.0.0-SNAPSHOT              
[1/8]
[INFO] --------------------------------[ pom ]---------------------------------
[WARNING] The POM for org.openjfx:javafx.base:jar:11.0.0-SNAPSHOT is missing, no dependency information available
[INFO]

由于不满足依赖关系,我无法(至少不是以我能想到的方式)让 Maven 告诉我为什么它想要这样做,所以我不知道去哪里看,并且该项目似乎并没有首先引用 javafx(作为一个 Spring Boot 微服务,这让我有点惊讶)。因此这个问题。

是什么原因造成的,我该如何解决?


正如 Karol 正确推断的那样,这个问题之前已经出现过,解决方法是将 hibernate 验证器依赖项升级到更新的版本。我所需要的只是将以下属性添加到我的父 pom:

    <!-- needed for building with Java 11 -->
    <hibernate-validator.version>6.0.12.Final</hibernate-validator.version>

【问题讨论】:

如果我被允许,将创建 500 点的赏金。如果在此之前解决了问题,赏金将转到该答案。 那么为什么它在 11 上失败了 - 因为在 11 中 java javaFX 不再是 JDK 的一部分,而是独立模块。我认为您可以使用 maven 添加它并检查这是否有帮助。为什么它会丢失 - 它可能是一些传递依赖?你可以分享你的构建文件吗 @ThorbjørnRavnAndersen 您必须分享您当前的mumble-data-service-parent 模块pom.xml 的样子。这就是人们可以开始寻找原因的地方。此外,如果它有一个parent,那可能会带来一些与依赖管理一起的东西。或者可能是指向项目/MCVE 的链接以重现您刚才所说的错误会进一步改善问题。 不幸的是,*** 不允许我将 help:effective-pom 的输出附加到问题中:-/ 【参考方案1】:

如果org.hibernate.validator:hibernate-validator:jar:6.0.11.Final 是您的依赖项的一部分,这可能是由HV-1644 Using Hibernate Validator with Java 11 brings JavaFX on the classpath 引起的。更新到6.0.12 或更高版本应该可以解决它。

【讨论】:

我知道 JavaFX 不再是 JDK 的一部分。据我了解,我们的模块没有引用 javafx,所以我不明白为什么 Maven 想要将其引入。依赖项可能会引用它,但适用于 Java 10 的“mvn dependency:tree”既没有提到 javafx,也没有提到 openjfx。所以我不知道在哪里进行建议的更改。 @ThorbjørnRavnAndersen 试试mvn help:effective-pom 看看运行时pom.xml,也许是插件的依赖?如果没有看到您的有效pom.xml,就无法调试它。 @ThorbjørnRavnAndersen 可以是 org.hibernate.validator:hibernate-validator:jar:6.0.11.Final:compile,如 HV-1644 Using Hibernate Validator with Java 11 brings JavaFX on the classpath。请添加您的pom.xml 我无法附加 help:effective-pom 的输出,因为在尝试保存非常大的编辑时 *** 失败,而且我没有立即放置它的地方。但是,确切的休眠依赖项在那里(可能是由弹簧启动引入的)。我会仔细看看。现在谢谢。 你的推论是正确的。我已经接受了你的回答。如果在接下来的几天内没有奖励赏金,请提醒我。【参考方案2】:

最近我在使用带有 JDK 11 的 Maven 构建工件时遇到了同样的问题。指定了一些依赖项来使用工件 org.openjfx:javafx.base:11.0.0-SNAPSHOT(JavaFX,它不再是 Java 11 的一部分)。所以 Maven 一直想下载这个工件,事实上,它在我们的 Maven 存储库中并不存在。因此,构建随后失败,依赖关系树的分析也失败了。我无法确定该工件将用于何处。

我搜索了这个工件的用法,并在 Maven JIRA 中发现了这个关于 Hibernate 的错误问题:Dependency resolution broken with Java 11 (MNG-6500)。

据说在 Hibernate 6.0.11 中这个工件是在 org.hibernate.validator:hibernate-validator:6.0.11.Final 的 POM 中指定的。但是我不知道在我的项目中使用了这种 Hibernate 依赖项。我在整个本地 Maven 存储库中搜索了这个工件。令人惊讶的是,org.glassfish.jersey.ext:jersey-bean-validation:jar:2.28 使用了提到的 Hibernate 工件(它在指定了 hibernate-validator 版本的父链中有一个父 org.glassfish.jersey:project:2.28)。而这个依赖又被io.confluent:kafka-schema-registry:jar:5.4.0使用。

所以我唯一要做的就是从io.confluent:kafka-schema-registry:jar:5.4.0 依赖项中排除这个 JavaFX 工件

<dependency>
    <groupId>io.confluent</groupId>
    <artifactId>kafka-schema-registry</artifactId>
    <version>5.4.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx.base</artifactId>
        </exclusion>
    </exclusions>
</dependency>

【讨论】:

在 Confluent 库中引入 hibernate-validator 的上游有一些关于这个问题的评论:github.com/confluentinc/rest-utils/issues/170

以上是关于是啥让 Maven 想要使用 Zulu Java 11 的 openjfx 而不是 Zulu Java 8 用于 Spring Boot 项目?的主要内容,如果未能解决你的问题,请参考以下文章

是啥让 nativescript 比 ionic 更好

是啥让语言面向对象?

是啥让一些 EXIF 标签不可写?

是啥让线程的执行顺序不可预测?

是啥让 Qt 小部件及其布局正常运行(就其大小而言)?

弄清楚是啥让 VS2008 中的 C++ 类抽象