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

Wor*_*tig 7 java javafx maven

我试图仅包含 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Maven 部门:

部门

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

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

也许值得注意的是,我在 Windows 和 Ubuntu 上都使用 Eclipse IDE 2021-03。

Jos*_*eda 9

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

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
        </dependency>
    </dependencies>
Run Code Online (Sandbox Code Playgroud)

它只适用于您的平台,不需要分类器。

现在,如果你检查依赖关系,并且你在 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
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Windows 或 Mac 操作系统,则相同。

您可以猜测如何javafx-controls获取遍历依赖项:通过其 pom.xml 。但它如何获得分类器呢?

让我们检查一下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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,已经应用了一个基于${javafx.platform} Maven属性的分类器。

该属性通过父 pom 解析:

    <parent>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx</artifactId>
        <version>16</version>
    </parent>
Run Code Online (Sandbox Code Playgroud)

如果你检查它的内容

<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
...
Run Code Online (Sandbox Code Playgroud)

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

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

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
            <classifier>win</classifier>
        </dependency>
    </dependencies>
Run Code Online (Sandbox Code Playgroud)

你会得到:

$ 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
Run Code Online (Sandbox Code Playgroud)

依赖关系是正确的,您首先获得了 win 版本,但随后它自己的 pom 具有对 的依赖关系javafx-controls:${javafx.platform},这是根据您的平台(即 Linux)解决的,这也解释了为什么您也获得了平台工件。

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

编辑

如果你继续阅读javafx父pom,有这样的配置文件:

<profile>
            <id>javafx.platform.custom</id>
            <activation>
                <property>
                    <name>javafx.platform</name>
                </property>
            </activation>
            <properties>
                <javafx.platform>${javafx.platform}</javafx.platform>
            </properties>
        </profile>
Run Code Online (Sandbox Code Playgroud)

这是一个配置文件,如果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
Run Code Online (Sandbox Code Playgroud)

这很有效,不再需要平台分类器。

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