Maven 包括操作系统的 JavaFX 依赖项我目前 运行 即使我分类其他

Maven include JavaFX dependencies for operation system i am currently running on even when i classify other

我正在尝试仅包含 mac OS 的 JavaFX 依赖项,但仍会下载 win。 linux 部门也是如此。

pom.xml:

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>11.0.2</version>
    <classifier>linux</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-controls</artifactId>
    <version>11.0.2</version>
    <classifier>linux</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-fxml</artifactId>
    <version>11.0.2</version>
    <classifier>linux</classifier>
</dependency>

Maven 部门:

pom.xml:

<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>11.0.2</version>
    <classifier>mac</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-controls</artifactId>
    <version>11.0.2</version>
    <classifier>mac</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-fxml</artifactId>
    <version>11.0.2</version>
    <classifier>mac</classifier>
</dependency>

Maven 部门:

如何删除 win JavaFX 库或使 Maven 不下载它们?

当我使用 Ubuntu (Linux) 时,同样的事情发生了。当我分类时,我想要 mac 个库,linux 个库也被下载等

也许值得注意我在 Windows 和 Ubuntu.

上都使用 Eclipse IDE 2021-03

当您通过 Maven Central 的 Maven 工件使用 JavaFX 时,您通常会添加到您的 pom:

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
        </dependency>
    </dependencies>

在您的平台上正常工作,不需要分类器。

现在,如果您检查依赖关系,例如,您在 Linux 上,您会发现:

$ mvn dependency:tree

[INFO]  org.openjfx:javafx-controls:jar:16:compile
[INFO]    +- org.openjfx:javafx-controls:jar:linux:16:compile
[INFO]    \- org.openjfx:javafx-graphics:jar:16:compile
[INFO]       +- org.openjfx:javafx-graphics:jar:linux:16:compile
[INFO]       \- org.openjfx:javafx-base:jar:16:compile
[INFO]          \- org.openjfx:javafx-base:jar:linux:16:compile

如果您在 Windows 或 Mac OS.

,则相同

你可以猜到 javafx-controls 是如何获取遍历依赖项的:通过它的 pom.但是它是如何得到分类器的呢?

让我们检查一下 pom:

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-controls</artifactId>
    <version>16</version>
    <parent>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx</artifactId>
        <version>16</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
            <classifier>${javafx.platform}</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>16</version>
        </dependency>
    </dependencies>
</project>

如您所见,已经应用了一个基于 ${javafx.platform} maven 属性.

的分类器

属性 通过父 pom 解析:

    <parent>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx</artifactId>
        <version>16</version>
    </parent>

如果你检查它 content:

<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>16</version>
<packaging>pom</packaging>
<name>openjfx</name>
<description>OpenJFX JavaFX</description>
<url>https://openjdk.java.net/projects/openjfx/</url>
<properties>
    <javafx.version>16</javafx.version>
</properties>
<dependencyManagement></dependencyManagement>
<profiles>
    <profile>
        <id>linux</id>
        <activation>
            <os>
                <name>linux</name>
            </os>
        </activation>
        <properties>
            <javafx.platform>linux</javafx.platform>
        </properties>
    </profile>
    // windows profile
    // mac profile
...

这意味着有一个配置文件会根据您当前的平台被激活,并自动设置 属性 ${javafx.platform},进而设置您的依赖项分类器。

那么,如果您将不同的分类器添加到您的 JavaFX 依赖项(例如您在 Linux 上),会发生什么情况:

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
            <classifier>win</classifier>
        </dependency>
    </dependencies>

您将获得:

$ mvn dependency:tree

[INFO] \- org.openjfx:javafx-controls:jar:win:16:compile
[INFO]    +- org.openjfx:javafx-controls:jar:linux:16:compile
[INFO]    \- org.openjfx:javafx-graphics:jar:16:compile
[INFO]       +- org.openjfx:javafx-graphics:jar:linux:16:compile
[INFO]       \- org.openjfx:javafx-base:jar:16:compile
[INFO]          \- org.openjfx:javafx-base:jar:linux:16:compile

依赖是正确的,你先拿到的是win版本,然后它自己的pom对javafx-controls:${javafx.platform}有依赖,根据你的平台解决(即Linux),那解释了为什么您也会获得平台工件。

我不知道如何避免这种情况,因为您无法在依赖项的 pom 中禁用配置文件激活。

编辑

如果你继续阅读 javafx parent pom,有这个配置文件:

<profile>
            <id>javafx.platform.custom</id>
            <activation>
                <property>
                    <name>javafx.platform</name>
                </property>
            </activation>
            <properties>
                <javafx.platform>${javafx.platform}</javafx.platform>
            </properties>
        </profile>

这是一个在设置 javafx.platform 时激活的配置文件,它会覆盖 ${javafx.platform} 值的先前值。

所以我刚刚尝试了 Linux(没有向依赖项添加任何分类器):

$ mvn -Djavafx.platform=win dependency:tree

[INFO] com.gluonhq.samples:hellopi:jar:1.0.0-SNAPSHOT
[INFO] \- org.openjfx:javafx-controls:jar:16:compile
[INFO]    +- org.openjfx:javafx-controls:jar:win:16:compile
[INFO]    \- org.openjfx:javafx-graphics:jar:16:compile
[INFO]       +- org.openjfx:javafx-graphics:jar:win:16:compile
[INFO]       \- org.openjfx:javafx-base:jar:16:compile
[INFO]          \- org.openjfx:javafx-base:jar:win:16:compile

这行得通,不再需要平台分类器。

尽管如此,您的 IDE 可能会显示平台依赖性,但只要您 运行 使用 属性(如 mvn -Djavafx.platform=win javafx:run)就应该可以工作。

Eclipse 的简答 IDE:

为每个平台创建三个 Maven 构建配置并指定参数 javafx.platform 值为 win、linux 或 mac 每个配置。

无非是在mvn命令中加上"-Djavafx.platform={platform}"

然而,在 Eclipse IDE.

中的 Maven Dependencies 中还会显示其他平台依赖项