Maven为什么要在使用Zulu Java 11而不是Zulu Java 8的Spring Boot项目中使用openjfx?

13
我继承了一个Spring Boot项目,我们想在测试中使用Java 11,因为Java 9和10中增加了一些不错的功能(如varList.of(...))。该Maven项目分为几个部分,其中生产代码设置为Java 8,测试代码设置为Java 11。这在模块单独构建时很好地工作,并且全局构建可以使用Java 8(除了测试无法编译)和Java 10。现在我想从根目录使用Java 11编译所有内容,因为这是LTS(在Windows 10上使用Zulu),但由于某种原因,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点的赏金。如果问题在此之前得到解决,赏金将给予该答案。 - Thorbjørn Ravn Andersen
为什么它在11上失败了 - 因为在11中,JavaFX不再是JDK的一部分,而是独立模块。我认为您可以使用Maven添加它并检查是否有所帮助。为什么它缺失了 - 可能是某些传递依赖关系?您可以分享您的构建文件吗? - Alex G.
2
@ThorbjørnRavnAndersen,你需要分享一下你当前的mumble-data-service-parent模块的pom.xml文件是什么样子的。这是开始查找问题的地方。另外,如果它有一个“parent”,那可能会带来一些依赖管理方面的问题。或者提供一个可以重现你刚才所述错误的项目/MCVE链接,将进一步改善问题。 - Naman
很遗憾,Stackoverflow不允许我将help:effective-pom的输出附加到问题中 :-/ - Thorbjørn Ravn Andersen
2个回答

16

我知道JavaFX不再是JDK的一部分。据我了解,我们的模块没有引用JavaFX,所以我不明白为什么Maven要拉取它。但是某个依赖项可能会引用它,但是“mvn dependency:tree”与Java 10一起使用时既不提到JavaFX也不提到OpenJFX。因此,我不知道在哪里进行建议的更改。 - Thorbjørn Ravn Andersen
尝试使用 mvn help:effective-pom 命令查看运行时的 pom.xml 文件,也许它是某个插件的依赖项? 没有看到你有效的 pom.xml 文件将无法进行调试。 - Karol Dowbecki
3
根据 HV-1644 使用 Hibernate Validator 与 Java 11,会在 classpath 上带入 JavaFX,可能需要将 org.hibernate.validator:hibernate-validator:jar:6.0.11.Final:compile 加入你的 pom.xml。请添加相应代码。 - Karol Dowbecki
我无法附加来自help:effective-pom的输出,因为当尝试保存非常大的编辑时,stackoverflow会失败,而我也没有立即放置它的地方。但是,那个确切的hibernate依赖项在其中(可能是由spring boot引入的)。我会仔细看看。谢谢您。 - Thorbjørn Ravn Andersen
你的推断是正确的。我接受了你的答案。如果赏金在未来几天内没有被授予,请提醒我。 - Thorbjørn Ravn Andersen
非常有帮助。我卡在这里已经一个星期了...谢谢。 - Learner

3

最近我遇到了一个使用JDK 11和Maven构建工件的问题。某些依赖项被指定为使用artifact org.openjfx:javafx.base:11.0.0-SNAPSHOT(JavaFX不再是Java 11的一部分)。因此,Maven总是想要下载这个不存在于我们的Maven存储库中的artifact。因此构建后续失败,依赖树的分析也失败了。我无法确定这个artifact将在哪里使用。

我在Google上搜索了这个artifact的用法,并在Maven JIRA中找到了一个有关Hibernate的bug问题:Dependency resolution broken with Java 11 (MNG-6500)

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

因此,我需要做的唯一一件事就是从io.confluent:kafka-schema-registry:jar:5.4.0依赖项中排除这个JavaFX artifact:

<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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接