我试图仅包含 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。
当您通过 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)运行,就应该可以工作。
| 归档时间: |
|
| 查看次数: |
2491 次 |
| 最近记录: |