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

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

邹举
2023-03-14

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

当我使用IntelliJ的构建工件功能时:“fx:deploy不可用”我不知道如何使用jlink,并且所有在线教程都让我感到困惑。大多数 javafx 教程都是从它是 JDK 的一部分开始的,所以这无济于事。我不知道如何使用梅文和格拉德。

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

我花了几周时间试图弄清楚这一点,所以有人能帮我把它降低到婴儿级别吗?关于如何把它变成可运行的东西或exe?我知道我听起来很傻,但我只是累了。

共有2个答案

史弘博
2023-03-14

这与jlink无关,只是与您创建工件的方式有关。

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

为此,您必须转到文件-项目结构-工件。

然后单击加号“ ”,将鼠标悬停在 JAR 上并选择“来自具有依赖关系的模块”。

之后,在弹出式显示中选择“主类”栏并输入主类(可能标题为“主类”),然后单击确定。

然后你会看到一个新的盒子。在该框中单击其中的加号,然后单击“文件”。

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

之后,在工件窗口上点击“ok ”,它将关闭。

现在,您可以设置单击“构建工件”按钮!

单击按钮并选择“构建”

单击按钮后,.jar文件将显示在项目文件夹中的“out”下和“工件”中!

有好的一天!:)

巫墨一
2023-03-14

一种选择是使用< code>jpackage工具。这个工具在Java 14-15中是一个孵化特性,在Java 16中是标准化的。它创建一个自包含的应用程序。换句话说,生成的应用程序不仅包含您自己的代码和任何依赖项,还包含嵌入式Java运行时环境(JRE)。这样,您的最终用户就不必担心安装Java或JavaFX。相反,它们以本机安装程序/可执行文件结束。

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

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

├───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编译代码,因此我不建议创建名称与模块名称匹配的目录。

这是模块信息。java文件:

module com.example {
  requires javafx.controls;

  exports com.example.app to javafx.graphics;
}

这是主.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 out\classes

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

javac --module-path <path-to-fx> --module-source-path src --module com.example -d out\classes

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

下面是打包现已编译的应用程序的命令。

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

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

--dule参数告诉工具主模块和类是什么(即应用程序的切入点)。它的格式是

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

上面的示例完全来自命令行。您可能使用IDE,因此某些步骤可能会有所不同。例如,您可以依靠IDE编译代码,如果需要,可以将其打包到JAR文件中。您甚至可以让IDE处理html" target="_blank">调用jpack,但我不确定。

 类似资料:
  • > 控制器 } 服务 -板 > 原因:java。lang.IllegalArgumentException:给定的id不能为null!位于组织。springframework。util。明确肯定组织中的notNull(Assert.java:201)。springframework。数据jpa。存储库。支持简单Parepository。java上的deleteById(SimpleJpaRepos

  • 我想使它从“游戏26”类到“游戏39”类,如果用户经历了从“游戏17”类到“游戏18”类。但如果用户没有通过,要使从“Game26”类到“Game30”类。

  • /tester.java:3:错误:import java.lang.Math类型的非法启动;^Tester.java:3:错误:应输入java.lang.Math>*;^

  • 如何使用slick和lwjgl(轻量级java图形库)将eclipse导出为可运行的java文件? 所以,我对此做了一些研究,相信我已经找到了问题的根源,以及需要解决的问题,现在我需要找出如何解决它。 我有一个相当大的项目,使用slick和lwjgl。这两个都是按如下方式提供的。我在IDE中添加到java构建路径的jar文件(Eclipse INDIGO,以防您想知道在哪里)。 我的目标是将这个片

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严

  • 我在第一个场景上有一个简单的按钮,应该会导致第二个场景。当我点击按钮时,它改变场景,但只显示一个空白屏幕。如果我关闭原始舞台,然后显示一个包含新场景的新舞台,它会正常工作,但我不想打开一个新窗口。 这是我的控制器类: 主类: