【问题标题】:JAR File Creation in JDK 11 and JavaFx在 JDK 11 和 JavaFx 中创建 JAR 文件
【发布时间】:2018-12-05 18:14:00
【问题描述】:

正如我们已经知道,在 JDK-10 之前,JavaFX 曾经是 JDK 的一部分,但随着 JDK-11 的发布,JavaFX 将被单独包含。

为此,我们需要为 JavaFX 提供 VM 参数,如下所示:-

--module-path "C:\javafx-sdk-11.0.1\lib" --add-modules=javafx.controls,javafx.fxml

到目前为止,一切都很好,但是当我们最终创建一个 JAR 文件进行分发时,会出现如下消息:

VM 参数不会成为可运行 JAR 的一部分。启动 JAR 时可以在命令行中传递参数

因此现在 JAR 文件无法打开应用程序。

现在请帮助我建议一些方法,以便用户只需单击 JAR 图标即可打开应用程序,就像以前一样。

编辑

应用提供的解决方案后 openjfx.io(非模块化项目部分),我可以使用 JavaFX 生成独立 Jar 文件。

现在我想添加一些本地依赖项,例如 pdfboxSqlite

sqlite =C:\sqlite-jdbc-3.6.20.1.jar 
pdfbox=C:\pdfbox-app-2.0.10.jar

我正在执行以下步骤:

第一步

cd eclipse-workspace2018\test101

第二步

set PATH_TO_FX="C:\javafx-sdk-11.0.1\lib"

第三步

dir /s /b src\*.java > sources.txt & \
    javac --module-path %PATH_TO_FX% --add-modules=javafx.controls \
    -d out @sources.txt & del sources.txt

第四步

cd out & jar xf "%PATH_TO_FX%\javafx.base.jar" & \
    jar xf "%PATH_TO_FX%\javafx.graphics.jar" & \
    jar xf "%PATH_TO_FX%\javafx.controls.jar" & \
    cd .. 
copy "%PATH_TO_FX%\..\bin\prism*.dll" out & \
    copy "%PATH_TO_FX%\..\bin\javafx*.dll" out & \
    copy "%PATH_TO_FX%\..\bin\glass.dll" out & \
    copy "%PATH_TO_FX%\..\bin\decora_sse.dll" out 
del out\META-INF\MANIFEST.MF & del out\module-info.class 
mkdir libs 
jar --create --file=libs/index101.jar \
    --main-class=test101.Launcher -C out . 
java -jar libs\index101.jar

请修改我添加上述两个依赖项 pdfBox 和 sqlite 的步骤。

【问题讨论】:

  • 在执行 jar 时添加这些参数。
  • 请详细说明**执行jar **
  • 您的意思是在发布时?如果是,请修改我的代码,如下所示:- public static void main(String[] args) { launch(args); }
  • 是的,我的意思是在运行 jar 时,您可以添加类似的 VM 参数并试一试。例如尝试从命令行执行。
  • 谢谢你,但仍然存在问题是因为 javaFx-jdk 不是 JRE 的一部分,也没有成为最终生成的 JAR 的一部分。因此,应用程序的最终用户将无法运行该应用程序,除非他们的系统中有 javaFx-jdk 的副本。此外,通过传递附加参数等命令运行对开发人员来说是可以的,但对用户来说是不行的。请帮忙

标签: java javafx


【解决方案1】:

首先,提个建议:完全不建议在命令行上创建 fat jars。这是一个应该避免的手动过程。你应该尝试使用 Maven 或 Gradle 以及现有的插件来完成这个任务,以防你仍然需要一个胖 jar。相反,您应该尝试创建一个模块化项目,并使用 jlink 创建一个自定义映像,您可以为给定平台分发该映像。

其次,如果你还想手动做一个fat jar,你应该了解上面的步骤,以便能够根据你的需要进行修改。基本上,胖 jar 的主要思想是一个包含所有可能依赖项的所有 *.class 文件(和其他资源)的单个项目,而不仅仅是源代码中的那些。 openjfx.io 上的教程只是提到了 JavaFX 依赖的情况。

因此,如果您有额外的依赖项,我们的想法是提取其 jar 的内容,就像提取 JavaFX jar 一样。请参阅jar 命令选项,例如xf

这是在第 3 步中完成的:

cd out & jar xf "%PATH_TO_FX%\javafx.base.jar" & \
    jar xf "%PATH_TO_FX%\javafx.graphics.jar" & \
    jar xf "%PATH_TO_FX%\javafx.controls.jar" & \
    cd .. 

您可以使用现有的 jar 修改该步骤:

cd out & jar xf "%PATH_TO_FX%\javafx.base.jar" & \
    jar xf "%PATH_TO_FX%\javafx.graphics.jar" & \
    jar xf "%PATH_TO_FX%\javafx.controls.jar" & \
    jar xf "C:\sqlite-jdbc-3.6.20.1.jar" & \
    jar xf "C:\pdfbox-app-2.0.10.jar" & \
    cd .. 

然后您可以以相同的方式继续其余步骤。

请注意,虽然这可能有效,但那些第三方 jar 可能还有其他依赖项(请参阅他们的 pom.xml)。如果是这种情况,您将需要手动下载它们,并以相同的方式将它们添加到 fat jar 中。如果您使用 Maven 或 Gradle,它们会自动为您完成。

如前所述,完全不建议这样做。

【讨论】:

  • 谢谢先生,我知道我需要学习 Maven 才能以适当的方式解决我的问题。
猜你喜欢
  • 2019-03-05
  • 2019-05-01
  • 2021-04-24
  • 1970-01-01
  • 2019-03-03
  • 2019-03-30
  • 2021-05-11
相关资源
最近更新 更多