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 中还会显示其他平台依赖项
我正在尝试仅包含 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 中还会显示其他平台依赖项