我不知道我在做什么,试图将JavaFx导出为Jar / Exe



我正在尽最大努力导出我的javafx(11)项目,但似乎什么都不起作用。我在IntelliJ IDE上,例如,让我们使用这个项目:https://github.com/EveningSt3r/JFX-hotel-project.(我在30分钟内写了这篇文章,但它很简单,满足了这个问题的目的)

当我使用IntelliJ的Build Artifacts函数时:;fx:部署不可用";我不知道如何使用jlink,所有的在线教程都难住了我。大多数javafx教程都是JDK的一部分,所以这没有帮助。我不知道如何使用Maven和Gradle。

这是来自一个对Java的实际工作原理不太了解的家伙,他只知道如何制作东西。

我已经花了几个星期的时间试图弄清楚这一点,所以有人能不能把它简化到婴儿级别,告诉我如何把它变成可运行的或exe?我知道我听起来很愚蠢,但我只是厌倦了

一个选项是使用jpackage工具。该工具是Java 14-15中的一个孵化功能,并在Java 16中进行了标准化。它创建了一个自包含的应用程序。换句话说,生成的应用程序不仅包含您自己的代码和任何依赖项,还包含嵌入式Java Runtime Environment(JRE)。这样,您的最终用户就不必担心安装了Java或JavaFX。相反,它们最终得到了一个本机安装程序/可执行文件。

有一个jpackage的用户指南。这个网站上的另一位用户(如果我没有记错的话,还有其他用户)创建了一个脚本,可能会让事情变得更简单:JPackageScriptFX。


这里是一个创建JavaFX应用程序的最小示例,其中该应用程序与jpackage一起打包,完全从命令行执行。该示例假设一个模块化应用程序(即,您的代码和所有依赖项都有一个module-info文件),但jpackage也能够打包基于类路径的应用程序(例如,非模块化的应用程序)。

项目结构

├───out
│   ├───classes
│   └───package
└───src
└───com.example
│   module-info.java
│
└───com
└───example
└───app
Main.java

注意,我在一个名为com.example的目录下有源代码。这与模块的名称相同,使手动使用javac变得更容易(编译模块时)。不过,你不需要这么做。事实上,如果您使用的是IDE,那么您的源代码可能直接位于src下(如果使用Maven/Gradle,则为src/main/java)。

由于您可能让IDE编译代码,因此我不建议创建一个名称与模块名称匹配的目录。

源文件

这是module-info.java文件:

module com.example {
requires javafx.controls;
exports com.example.app to javafx.graphics;
}

这是Main.java文件:

package com.example.app;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
public void start(Stage primaryStage) {
StackPane root = new StackPane(new Label("Hello, World!"));
Scene scene = new Scene(root, 500, 300);
primaryStage.setScene(scene);
primaryStage.setTitle("JPackage Example");
primaryStage.show();
}
}

汇编

这是编译上述代码的命令。请注意,工作目录是项目目录。

javac --module-source-path src --module com.example -d outclasses

我有一个JDK,其中包括JavaFX。如果没有,则需要确保将JavaFX放在模块路径上。例如:

javac --module-path <path-to-fx> --module-source-path src --module com.example -d outclasses

但同样,您可能会让IDE处理编译。

包装

这是用于打包现在已编译的应用程序的命令。

jpackage --type app-image --name JPackageExample --module-path out/classes --module com.example/com.example.app.Main --dest out/package

CCD_ 12确定应用程序类型。在Windows上有三个选项:app-image(我相信所有平台都通用)、exemsi。第一个将简单地创建一个分解目录(在Windows上包含一个exe文件)。后两者将为您的应用程序创建Windows安装程序。请注意,您必须在Windows上才能创建Windows软件包(对于MacOS和Linux也是如此)。

--module参数告诉工具什么是主模块和类(即应用程序的入口点)。它的格式是<main-module>[/<main-class>]。如果合适的话,可以省略主类(例如,您将代码打包到指定了--main-class的JAR文件中)。

同样,我有一个JDK,其中包括JavaFX。如果没有,请确保在--module-path参数中包含JavaFX以及您自己的代码重要信息:与编译过程不同,如果您将JavaFX与JDK分开,请确保将JavaFX JMOD文件放在模块路径上,而不是普通JAR文件;您可以从Gloon获得JMOD文件(可能与您获得JavaFXSDK的位置相同)。请记住,JavaFX是特定于平台的。


以上示例完全来自命令行。您可能正在使用IDE,因此某些步骤可能有所不同。例如,您可以依赖IDE来编译代码,如果需要,还可以将其打包到JAR文件中。您甚至可以让IDE处理调用jpackage,但我不确定。

它与jlink无关,只与创建工件的方式有关。

无论何时在IntelliJ中创建.jar文件,在创建工件之前,都必须将java bin文件中的文件输入到工件中。

要做到这一点,你必须去文件项目结构工件。

然后单击加号"+&";,将鼠标悬停在JAR上,然后选择From modules with dependencies。

之后,选择";主要类别";栏,输入您的主类(可能标题为"main"),然后点击ok

之后你会看到一个新盒子。在该框中单击其内部的加号,然后单击";文件";。

然后转到程序文件中的jre文件夹,该文件夹将位于"Java";文件夹进入,然后双击";bin";。突出显示FILE而不是文件夹中的所有内容,然后将其放入工件中。

在该点击之后;ok";在您的工件窗口上,它将关闭。

现在您已设置为单击";构建工件";按钮

点击按钮并选择";构建";

.jar文件将出现在您的项目文件夹中的";out";并且在";人工制品";点击按钮后!

祝你今天愉快!:)

最新更新