8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Maven 项目无法解析 JavaFX 依赖项

atlaska826 2月前

101 0

我需要一些关于如何解决我在项目中遇到的这个问题的建议,所以不会有一个最小的可重现的代码示例,因为它与代码本身无关。Maven 和 J...

我需要一些关于如何解决我在项目中遇到的问题的建议,因此不会有一个最小的可重现代码示例,因为它与代码本身无关。

Maven 和 Java 已正确设置并可在所有机器和操作系统上运行。项目最初是在 Linux 上使用 IntelliJ 创建的,可以在任何 Linux 机器上运行,没有任何问题。但是,尝试在 Windows 或 macOS 上运行 mvn clean install 该项目将始终导致以下错误:

[错误] 无法在项目 RNGame 上执行目标:无法解析项目 com.ceebee:RNGame:jar:1.0-SNAPSHOT 的依赖项:无法解析以下工件:org.openjfx:javafx-controls:jar:${javafx.platform}:21.0.3(缺失),org.openjfx:javafx-graphics:jar:${javafx.platform}:21.0.3(缺失),org.openjfx:javafx-base:jar:${javafx.platform}:21.0.3(缺失),org.openjfx:javafx-fxml:jar:${javafx.platform}:21.0.3(缺失),org.openjfx:javafx-media:jar:${javafx.platform}:21.0.3(缺失):找不到artiforg.openjfx:javafx-controls:jar:${javafx.platform}:21.0.3 位于中央( https://repo.maven.apache.org/maven2 )

这是我当前的 pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ceebee</groupId>
    <artifactId>RNGame</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>RNGame</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.2</junit.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx</artifactId>
            <version>21.0.3</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>21.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>21.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-media</artifactId>
            <version>21.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.32</version>
                <scope>provided</scope>
            </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.17.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>20</source>
                    <target>20</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.32</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>com.ceebee.rngame/com.ceebee.rngame.RNGame</mainClass>
                            <launcher>RNGame.sh</launcher>
                            <jlinkZipName>RNGame</jlinkZipName>
                            <jlinkImageName>RNGame</jlinkImageName>
                            <stripDebug>true</stripDebug>
                            <stripJavaDebugAttributes>true</stripJavaDebugAttributes>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <execution>
                        <id>copy-external-resources</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/target/res</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>res</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

我同时使用 macOS 13.4.1 和 Windows 10。以下是 mac 的输出, mvn --version 包括所有必要的信息:

Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0) Mavenhome:/usr/local/Cellar/maven/3.9.7/libexec Java 版本:21.0.3,供应商:Homebrew,运行时:/usr/local/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/HomeDefault 语言环境:en_GB,平台编码:UTF-8 操作系统名称:\'mac os x \',版本:\'13.4.1 \',arch:\'x86_64 \',系列:\'mac\'

Linux 上的 Maven 版本是 3.9.6。我在网上没有找到太多关于这个特定问题的信息。我的环境在每台机器上的设置都一样。该项目可以在任何其他 Linux 机器上正常构建,但不能在 Windows/macOS 上构建。相关的 JavaFX 工件正在下载并存在于 .m2 目录中 ,但 Maven 似乎无法解析它们。没有特定的 Maven 设置。关于的提示对 {javafx.platform} 我没有太大帮助,因为将此属性指定为 eg <classifier>mac</classifier> 没有帮助。

所有设置都是在 Windows/macOS 上全新设置的,具有正确的环境变量,并且 java 和 mvn 命令在命令行/终端上被识别。如能提供关于如何解决此问题的任何指示,我们将不胜感激。

帖子版权声明 1、本帖标题:Maven 项目无法解析 JavaFX 依赖项
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由atlaska826在本站《maven》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我不同意之前的一些评论,我认为其中一些细节很重要,最好在问题中而不是场外提供 pom.xml。

  • @matt 是的,mvn 包应该可以工作。但是对于提问者来说,它不行。我尝试使用提供的 pom.xml 来查看是否可以在环境(intel Mac)中让 mvn 包为我工作,结果工作正常。所以无论问题是什么,它似乎都是环境问题。

  • 我目前还没有 Maven 3.9.7 设置,但我想我可以稍后尝试一下。我想知道

  • 使用 maven 3.9.7 时我遇到了完全相同的问题。它仍然适用于 maven 3.9.6。

    Maven 票已存在 https://issues.apache.org/jira/browse/MNG-8131

  • 不错!我使用的是 3.9.6,并不认为版本有什么不同。我尝试了 3.9.7,但无法编译基本的 javafx 示例。

  • 这确实是罪魁祸首,非常感谢!我完全没有注意到我的 Linux 发行版的 Maven 版本仍为 3.9.6,因此它可以在我的 Linux 机器上运行。在 macOS 和 Windows 上重新设置后,我得到了最新版本,但显然存在此问题。如何报告此问题,或者是否已向 Apache 提交了已知问题?

  • 您可以通过 openjfx-dev 邮件列表通知 JavaFX 团队。对于 Apache Maven 团队,他们有一个错误报告流程,我想这可能是最好的方法。

  • 更新:问题似乎出在 OpenFX 的 pom 上,同时他们也已收到通知:mail.openjdk.org/pipermail/openjfx-dev/2024-May/047279.html

  • 引用 10

    JavaFX pom 的问题已通过 JavaFX 23-ea+20(来自 Maven Central)修复,并且它可以再次与 maven 3.9.7 一起使用。

  • 更新:Markus Friedli 在他的回答中指出,通过将 Maven 3.9.7 降级到 3.9.6,该问题已得到解决

    这个答案中的一些信息是在人们知道这一点之前写的。


    这(目前)不是对您的问题的真正答案,但它确实提供了一些背景信息和一个可能对您有用的潜在解决方法(明确将分类器设置为正确值)。

    解决方法:在 pom.xml 上明确设置分类器

    不幸的是,这个建议的解决方法对于提问者来说并不奏效。

    您可以通过从我上面提供的分类器菜单中明确将分类器设置为适合您系统的分类器来解决这个问题。如果这样做,您必须选择与您的系统匹配的分类器(例如, darwin 不是有效的分类器, mac 仅适用于 Intel mac,不适用于 M1 mac,等等)。

    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>21.0.3</version>
        <classifier>mac-aarch64</classifier>
    </dependency>
    

    建议:删除 org.openjfx:javafx::pom 工件

    不幸的是,这个建议并不能解决提问者的问题,但仍然建议这样做。

    我注意到你的 pom.xml 包含 pom 类型的依赖项:

    <groupId>org.openjfx</groupId>
    <artifactId>javafx</artifactId>
    <version>21.0.3</version>
    <type>pom</type>. 
    

    虽然它在我的环境中没有引起任何问题,但我不建议拥有该依赖项。我见过的其他 JavaFX 项目没有这样做。该 pom 应该是其他 JavaFX 模块的父项目,它允许 JavaFX 模块在包含它们时默认为自己选择正确的分类器。您不需要它作为项目中的依赖项。

    背景信息

    此信息的目的是解释 ${javafx.platform} .

    ${javafx.platform} 正在尝试设置 classifier .

    不同的项目可以使用分类器来实现不同的目的。

    JavaFX 使用它们为特定平台的工件版本提供 Maven 坐标,例如 intel mac、vs m 系列 mac、vs windows x64 等。

    您可以通过查看 JavaFX 的 Maven 存储库找到分类器:

    • https://repo1.maven.org/maven2/org/openjfx/javafx-graphics/22.0.1/

    您可以看到所使用的分类器是:

    • 来源 -> 源代码
    • javadoc->文档
    • 胜利 -> Windows x64
    • Linux -> Linux x64
    • linux-aarch64 -> Linux arm (64 位)
    • 苹果电脑 -> 英特尔苹果电脑
    • mac-aarch64 -> M 系列 Mac
    • 无分类器 -> 空壳罐

    所有代码(Java 和本机代码)实际上都在分类工件中,而不是未分类的空壳 jar 中。JavaFX Maven 工件在这方面有点奇怪,因为大多数项目都将其 Java 代码放在未分类的 jar 中。JavaFX 不会这样做,因为每个分类 Jar 中都有不同的 Java 和本机代码。例如,在 Mac Jar 中,有本机和 Java 代码来支持 Mac 系统菜单,而其他任何 jar 中都不需要它。

    当正在运行的 JavaFX 应用使用 Maven 工件时,它会在运行时从工件中提取本机组件并将其放入本地缓存目录中。这与使用 JavaFX SDK 时不同,在 JavaFX SDK 中,SDK jar 不包含本机组件,并且本机组件是从 SDK lib 目录加载的。

    通常,您不需要在添加依赖项时指定分类器(除非您想要 获取不同于您的开发系统平台的依赖项 )。

    如果你查看 pom.xml 中的 JavaFX 依赖项 .

    您可以看到它添加了一个 ${javafx.platform} 分类器:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-graphics</artifactId>
      <version>22.0.1</version>
      <parent>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx</artifactId>
        <version>22.0.1</version>
      </parent>
      <dependencies>
        <dependency>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-graphics</artifactId>
          <version>22.0.1</version>
          <classifier>${javafx.platform}</classifier>
        </dependency>
        <dependency>
          <groupId>org.openjfx</groupId>
          <artifactId>javafx-base</artifactId>
          <version>22.0.1</version>
        </dependency>
      </dependencies>
    </project>
    

    通常,Maven 可以解析该 ${javafx.platform} 属性并将其设置为适合您正在构建的机器的分类器。

    之所以这样做,是因为每个 JavaFX pom.xml 文件都使用一个 公共父 pom ,该 pom 会激活一个配置文件,该配置 ${javafx.platform} 文件会根据您的架构设置属性。这是 pom.xml 的简化版本,用于演示它如何执行此操作:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx</artifactId>
        <version>22.0.1</version>
        <packaging>pom</packaging>
        <name>openjfx</name>
        <description>OpenJFX JavaFX</description>
        <properties>
            <javafx.version>22.0.1</javafx.version>
        </properties>
        <profiles>
            <profile>
                <id>linux-x86_64</id>
                <activation>
                    <os>
                        <name>linux</name>
                        <arch>amd64</arch>
                    </os>
                </activation>
                <properties>
                    <javafx.platform>linux</javafx.platform>
                </properties>
            </profile>
            <profile>
                <id>linux-aarch64</id>
                <activation>
                    <os>
                        <name>linux</name>
                        <arch>aarch64</arch>
                    </os>
                </activation>
                <properties>
                    <javafx.platform>linux-aarch64</javafx.platform>
                </properties>
            </profile>
            <profile>
                <id>macosx-x86_64</id>
                <activation>
                    <os>
                        <name>mac os x</name>
                        <arch>x86_64</arch>
                    </os>
                </activation>
                <properties>
                    <javafx.platform>mac</javafx.platform>
                </properties>
             </profile>
             <profile>
                <id>macosx-aarch64</id>
                <activation>
                    <os>
                        <name>mac os x</name>
                        <arch>aarch64</arch>
                    </os>
                </activation>
                <properties>
                    <javafx.platform>mac-aarch64</javafx.platform>
                </properties>
             </profile>
            <profile>
                <id>windows-x86_64</id>
                <activation>
                    <os>
                        <family>windows</family>
                        <arch>amd64</arch>
                    </os>
                </activation>
                <properties>
                    <javafx.platform>win</javafx.platform>
                </properties>
            </profile>
            <profile>
                <id>javafx.platform.custom</id>
                <activation>
                    <property>
                        <name>javafx.platform</name>
                    </property>
                </activation>
                <properties>
                    <javafx.platform>${javafx.platform}</javafx.platform>
                </properties>
            </profile>
        </profiles>
    </project>
    

    无论出于什么原因(我再次不知道是什么), ${javafx.platform} 用系统分类器替换的机制都不起作用。

  • 非常感谢您的见解,非常感谢这些信息。我还希望平台能够由 maven 自行推断。然而,即使在 pom 中自己提供分类器也无济于事。在我的情况下,这将是苹果因为我确实在使用 Intel Mac。

  • 引用 13

    讨论非常有帮助。

    几天前我转移到了 Maven 3.9.7,但所有使用 OpenJFX 22.0.1 的项目都无法构建。

    我创建了一个仅包含一个文件 pom.xml 的小项目(见下文),并在 Windows 11 和 Ubuntu 24.04 上使用 Oracle JDK 22.0.1 和不同版本的 Maven 和 OpenJFX 对其进行了测试。

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>com.olexyarm</groupId>
            <artifactId>TestMaven</artifactId>
            <version>1.0.0</version>
            <packaging>jar</packaging>
            <name>TestMaven</name>
            <properties>
                <javafx.version>22.0.1</javafx.version>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-controls</artifactId>
                    <version>${javafx.version}</version>
                </dependency>
            </dependencies>
        </project>
    

    使用 Maven 3.9.7 和 OpenJFX 22、22.0.1、22.0.2 构建始终失败,并出现以下错误:

    [ERROR] Failed to execute goal on project TestMaven: Could not resolve dependencies for project com.olexyarm:TestMaven:jar:1.0.0: The following artifacts could not be resolved: org.openjfx:javafx-cont
    rols:jar:${javafx.platform}:22.0.1 (absent), org.openjfx:javafx-graphics:jar:${javafx.platform}:22.0.1 (absent), org.openjfx:javafx-base:jar:${javafx.platform}:22.0.1 (absent): Could not find artifact
     org.openjfx:javafx-controls:jar:${javafx.platform}:22.0.1 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
    

    使用 Maven 3.9.6 和 OpenJFX 22、22.0.1、22.0.2 构建始终成功。

    使用 Maven 3.9.7 和 OpenJFX 23-ea+22 构建成功。

返回
作者最近主题: