当前位置: 首页 > 知识库问答 >
问题:

Maven包括JavaFX依赖于我当前运行的操作系统,即使在我对其他操作系统进行分类时也是如此

郭博涉
2023-03-14

我试图只包含mac OS的JavaFX依赖项,但win仍然可以下载。linux DEP也是如此。

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 Deps:

<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>

共有1个答案

贺季同
2023-03-14

当您通过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

让我们检查一下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>

如果检查其内容:

<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)解析的,这也解释了为什么您还得到了platform工件。

我看不出如何避免这种情况,因为您不能在依赖项的POM中禁用配置文件激活。

编辑

如果您继续阅读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>

配置文件是在设置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)运行,该属性就应该起作用。

 类似资料:
  • 问题内容: 我要查看我是在Windows还是Unix等上,我需要查看什么? 问题答案: 的输出platform.system()如下: Linux: Linux Mac: Darwin Windows: Windows

  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成

  • sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的

  • 1、操作系统的运行机制 计算机系统中,通常CPU执行两种不同性质的程序,一种是操作系统内核程序;另一种是用户自编程序或系统外城的应用程序。对操作系统而言,这两种程序的作用不同,前者是后者的管理者和控制者,因此“管理程序”要执行一些特权指令,而“被管理程序”出于安全性考虑,不能执行这些指令。所谓特权指令,是指计算集中不允许用户直接使用的指令,如IO指令、置中断指令。 操作系统在具体实现上划分了用户态

  • 进程与线程 对于有线程系统: 进程是资源分配的独立单位 线程是资源调度的独立单位 对于无线程系统: 进程是资源调度、分配的独立单位 进程之间的通信方式以及优缺点 管道(PIPE) 有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信 优点:可以实现任意关系的进程间的通信 缺点: 长期存于系统中,使用不当容易出错 缓冲区有限 无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父

  • 1 select,poll和epoll 其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了. 这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好的了解了.其中tornado使用的就是epoll的. selec,poll和epoll区别总结 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点.