【问题标题】:how to create a distributable .jar with intelliJ JavaFX如何使用 intelliJ JavaFX 创建可分发的 .jar
【发布时间】:2020-03-29 23:03:02
【问题描述】:

自从我尝试导出一个用 JavaFX 制作的非常简单的项目以来已经有几天了,但我有一个非常令人沮丧的问题:要运行 jar,我需要打开 cmd 导航到 jdk 文件夹并执行以下代码java --module-path %path_to_JavaFX_on_my_pc% --add modules=javafx.controls,javafx.fxml,javafx.graphics -jar %path_to_jar% 我指向 pc 上的 jfx 文件夹并添加必要的模块来运行 jar。

使用 java java -jar %path_to_jar% 运行 jar 会导致以下错误:错误:JavaFX 运行时组件丢失,并且是运行此应用程序所必需的

该项目是模块化的,使用以下代码声明了 module-info.java:

module Timer {
requires java.prefs;
requires com.jfoenix;
requires javafx.base;
requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires javafx.media;
requires javafx.web;
requires javafx.swing;
opens main;
exports main;
}

在导出工件时,我包含了 javafx 中包含的所有 .jar,那么我为什么要在外部指向它呢?

当我通过 IDE 运行应用程序时,它运行良好,我什至不必添加 VM 选项。

我的目标是创建一个可以实际分发的应用程序,用户无需具备任何基础知识即可运行它,无需 jre、jdk、jfx、cmd 代码等...只需单击两次即可完成.

问题是:我如何生成一个可执行文件,可以像在 *any pc 上的 pc 上的任何其他应用程序一样单击 2 次打开?

【问题讨论】:

  • 您是否看到了像这里这样的现有答案:stackoverflow.com/questions/30145772/…
  • 我正在寻找最简单的方法来做到这一点,我的项目不使用 gradle 或 maven,所以 JavaPackager 似乎是最好的选择,但这个工具似乎已经灭绝了......有些软件可以将我的项目转换为 .jar、.exe 可执行文件或在 Windows 上运行的任何其他文件吗?实际上我不确定如何继续,如上所述,我可以创建一个 .jar 但它只能由 cmd 使用命令 --add-modules .... 执行,所以使用工具将此 jar 转换为另一种类型的可执行文件似乎无法解决问题
  • 您可以使用 exe4j 或 launch4j 并通过这些工具的配置提供所需的选项。但你是对的,没有简单的方法。 JavaFX 很难打包,尤其是如果您不使用 Maven 或 Gradle。
  • 我已经将 Launch4J 与 java Swing 一起使用,效果很好。但是我不确定如何在这里进行,有什么提示吗?
  • “JavaPackager [...] 似乎已经灭绝”——如果使用 Java 14,请查看 jpackage

标签: javafx


【解决方案1】:

我终于找到了解决问题的方法。

1° - 在 intelliJ 中使用 javaFx 生成 java 工件时有必要解决该问题:在 JDK 13 中,IDE 抛出以下错误 无法构建工件 - fx: deploy 在此 JDK 中不可用 最简单的解决方案是返回 JDK 9 并且 javaFx 仍然内置并且一切正常。完成此操作后,我能够生成无需使用命令行工具即可工作的 .jar 工件。

2° - 所以我需要为我的应用程序生成一个本机可执行文件:在这个topic 中有一个很好的工具列表,可以为 java 工件创建启动器(理想的是转换,但有点复杂)。最适合我的是 Jsmooth,我可以在其中设置一个内置在我的 .jar 中的启动器,并且我还可以在其中附加 JRE 的副本以便在没有 Java 的计算机上分发

值得注意的是,我开发的桌面应用程序仅供我和一些朋友使用,它们不处理敏感数据并且不需要高级别的安全性,因此使用旧的没有问题jdk版本,其他情况不推荐这种方式。

感谢大家的帮助。

【讨论】:

    【解决方案2】:

    我在使用 JavaFX 11 时遇到了同样的问题。为了能够生成 jar 工件,我将 Project Settings - Artifacts - Type 设置为 JAR 而不是 JavaFX Application。这使我能够在我的项目的out 目录中创建一个jar。之后,我编写了一个批处理文件,为我的应用程序创建了一个自定义 jre(对于一个小型应用程序来说,小至 40 MB),包括 JavaFX。我将那个bat 文件称为create.bat 并将那个bat 文件放在与我的jar 工件相同的文件夹中。

    现在,提供

    • 我的jar神器叫app.jar
    • JDK 的路径是D:\jdks\jdk11
    • JFX 模组的路径是D:\jdks\jfx11\jmods
    • 模块名称是com.epsilon,并且
    • Main 类的路径是com.epsilon.Main

    下面是 bat 文件的内容,用于创建自定义 JRE,包括 JavaFX。它在文件夹dist 中创建了一个自定义JRE,启动文件位于名为run.batdist\bin 目录中。

    rem This sets the variable DIR to the current directory with the jar artifact
    set DIR=%~dp0
    
    rem This creates a temporary mod file
    D:\jdks\jdk11\bin\jmod create --class-path %DIR%app.jar %DIR%temp.mod
    
    rem This creates distributable JRE
    D:\jdks\jdk11\bin\jlink ^
    --compress=2 ^
    --strip-debug ^
    --no-man-pages ^
    --launcher run=com.epsilon/com.epsilon.Main ^
    --module-path D:\jdks\jdk11\jmods;D:\jdks\jfx11\jmods;%DIR% ^
    --add-modules com.epsilon ^
    --output %DIR%dist
    
    rem This command deletes the temporary mod file
    del %DIR%temp.mod
    
    rem You can create a shortcut to your app above the "dist" folder and enter the below line to the shortcut's target property
    rem %windir%\system32\cmd.exe /c start "" "%CD%\dist\bin\javaw.exe" -m com.epsilon/com.epsilon.Main
    

    因此,这使我能够在不降级 Java 的情况下创建可工作的可分发文件。

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2019-10-16
      • 2016-02-09
      • 2020-01-08
      • 2011-10-30
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多