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

如何在不通过CMD提供VM参数的情况下执行javafx11jar

方夜洛
2023-03-14

Java:jdk12
构建工具:Maven
IDE:Eclipse
OS:Windows

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

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

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

因为我已经尝试使用maven作为:

---马文·波姆。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使其可执行。

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

共有1个答案

司承业
2023-03-14

使用javafxmaven插件,您可以执行两个目标:runjlink。前者只需使用所需的参数(--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>

并运行:

mvn clean javafx:jlink

它将生成您可以分发的项目的自定义运行时映像,您可以添加启动器,甚至压缩它。一旦提取,你将只需要这个来运行它:

target/appdir/app

请参见此处的插件选项。

阴影插件

您也可以使用maven-shade-plugin

正如这里所解释的,您将需要一个不从Application扩展的主类:

我auncher.java

package org.openjfx;

public class Launcher {

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

现在,您可以将shade插件添加到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>

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

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

跨平台

请注意,在这两种情况下(jlink或阴影插件),您将有一个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>
 类似资料:
  • 我想为android构建一个计算器应用程序,为此我需要一个解析器来转换要求解的字符串表达式。现在Java和Kotlin不支持eval函数,仅仅为了一个操作而导入javascript引擎可能会让我面临各种漏洞。所以我做了自己的计算器解析器。现在它工作得很好,除了crash中的负数外,所有算术运算都工作得很好。我确实知道问题是什么,因为我使用数学符号分隔字符串,但我不能在负值中执行任何操作。 输入:-

  • 问题内容: 我想在Centos7上使用shell脚本自动生成一对ssh密钥,我已经尝试过 所有这些命令都不起作用,仅输入一个“ enter”,然后在“ Enter passphrase(空无密码)为空”时停止shell脚本,我只想知道如何在shell中连续模拟多个“ enter”。 非常感谢任何人的帮助! 问题答案: 只需 使用一个空白通 使用标志: 要覆盖密钥文件 (在此示例中): 从 手册 页

  • 问题内容: 我想知道在不提示输入密码的情况下执行数据库mysqldump的命令。 原因:我想运行一个cron作业,该作业每天执行一次mysqldump数据库的转储。因此,出现提示时,我将无法插入密码。 我该如何解决? 问题答案: 由于您正在使用Ubuntu,因此您所要做的只是在主目录中添加一个文件,这将禁用mysqldump密码提示。这是通过创建文件来完成的(权限需要为600)。 将此添加到.my

  • 问题内容: 我正在尝试通过Java执行命令行参数。例如: 上面的命令打开命令行,但是不执行或。有任何想法吗?我正在运行Windows XP,JRE6。 (我已经对问题进行了更详细的修订。以下答案很有用,但不能回答我的问题。) 问题答案: 你发布的代码使用自己的命令启动三个不同的过程。要打开命令提示符然后运行命令,请尝试以下操作(请勿自己尝试):

  • 问题内容: 我的应用程序中有此表单,我将通过AJAX提交它,但是我想使用HTML5进行客户端验证。因此,我希望能够通过jQuery强制进行表单验证。 我想触发验证而不提交表单。可能吗? 问题答案: 要检查某个字段是否有效,请使用: 要检查表格是否有效,请使用: 如果要显示某些浏览器具有的本机错误消息(例如Chrome),很遗憾,唯一的方法是提交表单,如下所示: 希望这可以帮助。请记住,并非所有浏览

  • 我正在建立一个应用程序,用户将把他们的测试和作业和任何东西。我想知道我的应用程序是否有可能在测试前一周和一天发出通知? 我看到的到处都是firebase通知和push通知。 我不想要这些在线通知,我将需要应用程序发送他们自己离线。这可能吗?