如何在不通过 CMD 提供 VM 参数的情况下执行 JAVA FX 11 JAR

2023-12-09

Java:JDK 12
构建工具:Maven
集成开发环境:Eclipse
操作系统:Windows

我有一段简单的 java FX 11 代码,它显示一个简单的空白屏幕。 我已经使用 eclipse 部署了一个可执行 jar。 当我使用 CMD 给出以下命令时,它工作正常:

CMD command to run jar

可以看出,我需要在执行 JAR 文件时提供模块。

如果我们跳过这一步,我们会得到 JAR 直接执行错误:

JAR direct execution error

正如我已经尝试使用 Maven 那样:

---Maven pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.proj1</groupId>
    <artifactId>Proj1</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <type>maven-plugin</type>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13-ea+7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                <compilerArgs>
                <arg>--add modules</arg><arg> javafx.controls,javafx.fxml,javafx.graphics</arg>
                </compilerArgs>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.1</version>
                <configuration>
                    <mainClass>org.openjfx.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

但即使完成此操作,导出的可执行 JAR 仍然需要参数。

是否可以通过 CMD 以某种方式避免这种情况,并通过使用 Maven 双击 JAR 来使 JAR 可执行。

我不是在问如何解决 javaFx 运行时异常,而是在问如何通过添加依赖项来解决它,以便在分发 JAR 时,客户端不必传递运行时参数并通过简单的单击来完成工作。


使用 JavaFX maven 插件,您可以执行两个目标:run and jlink。前者只会使用所需的参数运行项目(--module-path, --add-modules),这样你就可以在命令行上运行:

mvn clean javafx:run

当然,这不是为了分发。

javafx:jlink

但是,如果您的项目是模块化的(即您有一个module-info.java文件),你可以设置你的插件,如:

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.2</version>
    <configuration>
        <mainClass>hellofx/org.openjfx.App</mainClass>
        <launcher>app</launcher>
        <jlinkImageName>appDir</jlinkImageName>
        <jlinkZipName>appZip</jlinkZipName>
    </configuration>
</plugin>

and run:

mvn clean javafx:jlink

它将使用您可以分发的项目生成自定义运行时映像,并且您可以添加启动器甚至压缩它。提取后,您只需要运行它:

target/appdir/app

查看插件选项here.

阴影插件

您还可以使用maven-shade-plugin.

正如所解释的here你将需要一个不扩展自的主类Application:

启动器.java

package org.openjfx;

public class Launcher {

    public static void main(String[] args) {
        App.main(args);
    }
}

现在你可以将阴影插件添加到你的 pom 中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation=
                                         "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>org.openjfx.Launcher</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Run mvn clean package,它将生成您的 fat jar,您可以将其分发并运行为:

java -jar target/hellofx-1.0-SNAPSHOT.jar

跨平台

请注意,在这两种情况下(jlink 或shade 插件),您将拥有一个jar,您只能将其分发到与您的平台相同的平台上运行。

但是,如果您还包含其他平台的依赖项,则可以使其成为多平台:

<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-controls</artifactId>
  <version>12.0.1</version>
</dependency>
<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-fxml</artifactId>
  <version>12.0.1</version>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>12.0.1</version>
    <classifier>win</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>12.0.1</version>
    <classifier>linux</classifier>
</dependency>
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-graphics</artifactId>
    <version>12.0.1</version>
    <classifier>mac</classifier>
</dependency>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不通过 CMD 提供 VM 参数的情况下执行 JAVA FX 11 JAR 的相关文章

随机推荐

  • 如何使用 iTextSharp 转换为 PDF

    ASP
  • 从 Parse.com 检索 PFFile 时“在解包可选值时意外发现 nil”

    当我检索 Parse com 中存储的 PFFile 时遇到问题 let user PFUser currentUser let userImageFile user profileImage as PFFile userImageFile
  • MQQueueManager消息池

    我过去使用 RabbitMq 作为 MessageQueue 当收到消息时触发事件非常简单 我查看了 IBM 安装程序提供的 NET 源代码 但发现处理它的方法不太好 查看示例 SimpleSubscribe 它做了这样的事情来池化 get
  • 如何维护数据库结构的修订控制?

    跟踪项目数据库结构更改的最简单方法是什么 当我更改数据库的某些内容 例如 添加新表 向现有表添加新字段 添加索引等 时 我希望将其传播到团队的其他成员 并最终传播到生产服务器 最小的麻烦和努力 目前 解决方案相当薄弱 并且依赖于人们记住做事
  • 为什么 TypeScript 无法从过滤数组推断类型?

    下面是一些示例代码 TypeScript 推断类型validStudents as Students 对于任何阅读代码的人来说 显而易见的是 因为所有无效记录都被过滤掉了 validStudents可以安全地被认为具有某种类型ValidSt
  • 递归执行广度优先搜索

    假设您想实现二叉树的广度优先搜索递归地 你会怎样做呢 是否可以仅使用调用堆栈作为辅助存储 我假设这只是某种思维练习 甚至是一个技巧作业 面试问题 但我想我可以想象一些奇怪的场景 由于某种原因你不允许任何堆空间 一些非常糟糕的习惯 内存管理器
  • 在VBA中修改现有的excel连接名称

    我需要更新 Excel 工作簿的 SQL 连接的连接名称 这是我的尝试 我已经能够通过执行标准替换来修改连接字符串和命令文本 Sub ConnectionString modify Dim i As Long Dim cnt As Long
  • 我想使用 .htaccess 从网址中删除问号和 .php 扩展名

    我在 htaccess 中遇到重定向 URL 问题 我想从 URL 中删除 php 和问号 例如 www example com test php id 12 to www example com test 12需要这样的格式 我尝试在我的
  • 获取QTextEdit选择的边界框

    我试图获取存储在列表中的一系列文本选择的边界框 边界框是可以包含整个选择的最小矩形 列表中的每个项目都有一个起始点和结束点 以字符数为单位从起始点开始计算QTextEdit窗口和字母标识符 QTextEdit cursorRect curs
  • DT 默认折叠所有行组

    我试图默认情况下使数据表中的所有行组折叠 我目前的实施 library shiny library DT ui lt fluidPage Application title titlePanel Collapse Expand table
  • 如何从 PHP 网站向 iOS 和 Android 发送推送通知?

    如何从 PHP 网站向 iOS 设备和 Android 设备发送推送通知 有这方面的教程吗 您可以使用多种预制服务来推送通知 例如 Firebase Messaging One Signal 等 有关与 PHP 集成的 Firebase 云
  • 在 iPhone OS 4.0 中以编程方式获取自己的电话号码

    我正在为越狱手机开发一个iPhone应用程序 在这个应用程序中我想获取用户的电话号码 我浏览了整个 stackoverflow com 并找到了一些相关答案 但所有这些答案都已过时 并且不再适用于 iOS 4 0 这个问题最著名的解决方案是
  • 简单的 CSS 转换 - 没有任何效果

    我正在处理一个具有悬停时消失的渐变的图像 但是 我无法对此进行转换 我已经尝试了我所知道的所有 webkit 转换 但它似乎不起作用 这是 HTML a href http calvarygigharbor com heavenly hit
  • 当分支未显示在 gitbranch -l 中时更改分支

    当我克隆远程存储库时 我使用了以下命令 git clone b mybranch single branch git sub domain com repo git 之后 当我做了一个git branch l它只是向我展示了我克隆的分支 现
  • 对象引用丢失,但保留资源

    IndentedTextWriter tw new IndentedTextWriter internalTW tw 引用的对象丢失 但相关资源未在此处处置 TW 是文本编写器 其中internalTW是TextWriter OleDbCo
  • 使用验证集、训练集和测试集之间的顺序

    我试图了解机器学习中模型评估和验证的过程 具体来说 必须按什么顺序以及如何使用训练 验证和测试集 假设我有一个数据集 我想使用线性回归 我在各种多项式次数 超参数 之间犹豫不决 In 这篇维基百科文章 这似乎暗示顺序应该是 将数据分为训练集
  • Razor 引擎找不到视图

    Issue 我目前有一个 NET Core 库 用于将 Razor 页面呈现为 HTML 电子邮件 我正在关注本教程 编译时没有错误 但在运行时出现以下错误 无法找到视图 Views Emails NewOrder NewOrder csh
  • Gruntwiredep 没有连接一些 Bower 组件

    我正在使用 yeoman webapp 生成器生成一个模板来开始我的工作 此时 我的 Bower json 看起来像这样 name sample project private true dependencies bootstrap sas
  • 通过正则表达式替换 StringBuilder 中的文本

    我想替换 StringBuilder 中的一些文本 这个怎么做 在这段代码中我得到了java lang StringIndexOutOfBoundsException与matcher find StringBuilder sb new St
  • 如何在不通过 CMD 提供 VM 参数的情况下执行 JAVA FX 11 JAR

    Java JDK 12构建工具 Maven集成开发环境 Eclipse操作系统 Windows 我有一段简单的 java FX 11 代码 它显示一个简单的空白屏幕 我已经使用 eclipse 部署了一个可执行 jar 当我使用 CMD 给