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

将IntelliJ中的JavaFX 11实现从“在IDE中使用jvm选项构建和运行”更改为“创建运行时映像”

郭俊拔
2023-03-14

我没有使用任何建议的答案来解决这个问题。最后,我有一些文件夹和文件可以压缩并发送,不需要java安装,可以通过双击. bat文件来运行。以下过程对我有用:

> < li>

从头开始创建新的gradle项目

将所有模块/代码添加到 src/主/java 文件夹中

创建一个调用main-方法的AppLauncher.java

将所有 fxml/css 从其中一个 Java 文件夹移动到资源文件夹

确保对fxml-/css-files的调用没有被错误重构,并使用以下代码:

//Main start method
Parent root = FXMLLoader.load(new File("fxml/main.fxml").toURI().toURL());

//Other FXML loading operations
FXMLLoader loader = null;
try { loader = new FXMLLoader(new File("fxml/GRAPHISO_proof.fxml").toURI().toURL()); }
...

对于样式表:

scene.getStylesheets().add("file:///" + new File("css/text-field-red-border.css").getAbsolutePath().replace('\\', '/'));
  • 在src/main/java文件夹中创建module-info.java,结构如下:
module XYZ {
    requires javafx.controls;
    requires javafx.graphics;
    requires java.desktop;
    requires javafx.fxml;
    requires javafx.base;

    opens main.controller to javafx.fxml;
    //Open ALL controller-modules (all of my modules have a controller-submodule, e.g. main/controller, dlog/controller, graphiso/controller, ...) to javafx.fxml
    //...

    exports main;
}

>

  • 确保gradle/包装器/gradle-wrapper.properties设置为一个不那么旧的gradle版本(分发URL=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

    使用这个作为你的构建.

    buildscript {
        repositories {
            maven {
                url "https://plugins.gradle.org/m2/"
            }
        }
        dependencies {
            classpath 'org.openjfx:javafx-plugin:0.0.8'
            classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
        }
    }
    
    plugins {
        id 'java'
        id 'org.beryx.jlink' version '2.19.0'
    }
    
    apply plugin: 'org.openjfx.javafxplugin'
    apply plugin: 'com.github.johnrengelman.shadow'
    
    group 'org.example.abc'
    version '1.0'
    
    sourceCompatibility = 1.14
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
    
    javafx {
        sdk = 'C:\\Program Files\\Java\\javafx-sdk-14.0.1'
        modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.base' ]
    }
    
    jlink {
        mainClassName = 'main.AppLauncher'
        launcher {
            name = 'Whatever you want as name'
        }
    }
    
    tasks.jlink.doLast {
        copy {
            from('src/main/resources')
            into("$buildDir/image/bin")
        }
        copy {
            from 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\glass.dll',
                 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\javafx_font.dll',
                 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_d3d.dll',
                 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_sw.dll'
            into("$buildDir/image/bin")
        }
    }
    

    请注意我是如何在任务中包含一些 dll 文件的。没有它们,程序会不断崩溃,并引用量子控制器。

      < li >安装openjdk-14.0.1二进制文件并相应地设置您的%JAVA_HOME%,同时安装openjfx-14.0.1(程序需要一些如上所述的dll)

    我试图通过使用IntelliJ中的“运行配置”功能,从我在JavaFX11中实现的项目创建一个运行时映像。在我看来,这里的一个大问题是,我对maven/gradle的知识几乎不存在,而这些构建工具对于这一步至关重要。

    在我安装的< code > C:\ Program Files \ Java 中:

    • 11.0.2
    • jdk-13.0.2

    我把IntellJ的“运行配置”里面的VM选项配置为< code >-module-path“C:\ Program Files \ Java \ Java FX-SDK-11 . 0 . 2 \ lib”-add-modules Java FX . controls,javafx.fxml并将主类设置为“Main。主”。

    我的项目结构看起来像这样:项目文件夹结构

    突出显示的Main.java是一个普通的主文件(扩展应用程序,在Main内部调用launch(args))。它可以加载位于其他包中的其他窗口。它不是一个不扩展应用程序的启动文件,而是调用实际的主文件(正如一些用于梯度构建的解决方案所建议的)。

    最初,我试图获得一个. jar文件,它可以在Windows和Linux上运行,不需要任何其他参数。经过一些阅读,我认为这不是一个干净的解决方案,许多资料表明,在现代解决方案中。jar文件将被放在一起,并以. bat/的形式发布。包含所有必要参数的sh文件。

    我的问题是:如何才能最好地将这个“ide内点击运行”项目转换成一个可以通过电子邮件或类似方式共享的“独立应用程序”,我需要哪些配置/附加文件?

    我试着通过IntelliJ创建了一个新的gradle项目(遵循https://openjfx.io/openjfx-docs ),并将源文件复制粘贴到src/main/java中。然后我试了试提供的build.gradle文件——之后没有用——根据各种博客/论坛等的建议做了一些修改。它们都不允许我通过IntelliJ或从命令行运行这个项目。

    这些方法中的大多数都允许我构建项目,但是当尝试使用"gradlew run"或调用"java-jarfile.jar"运行时,由于类异常,我收到了错误消息,或者说我仍然缺少javafx模块。我还尝试了一种方法将我当前的项目转换为gradle-project,但这甚至不允许我之后构建项目。

    我已经查看了JPackageScriptFX链接。现在我得到了一个在我的机器上运行的安装程序(使用mvn净安装),但是在运行生成的可执行文件时,我收到一条错误消息,上面写着“启动JVM失败”。

    到目前为止,我所做的是:

    > < li>

    已安装jdk-14.0.1并设置JAVA_HOME,已安装wix311

    创建了一个名为“bachelor_maven”的新IntelliJ maven项目

    已删除初始src文件夹

    在生成的src/main/java文件夹中添加了新的模块“ZKP_Inspector”和我的旧模块

    添加并编辑了JPackageScriptFX中的src/main/logo/windows/duke.ico、两个pom.xml文件和build_app.bat

    实现了AppLauncher。调用Main.java的java

    我的配置文件:

    >

  • 新项目结构:Imgur

    pom公司。xml(项目级,bachelor_maven):Pastebin

    pom.xml(模块级,ZKP_Inspector):Pastebin

    build_app.bat: Pastebin

    我尝试从build_app.bat文件的jpackage参数中删除< code >-runtime-image target/Java-runtime ^,以便让jpackage决定包含什么。这增加了安装程序的文件大小(如预期的那样),但在尝试执行生成的程序时会导致相同的错误。

    我还下载了JMOD文件,并在build_app的jlink任务中使用它们。这里暗示的蝙蝠。

    这产生了另一个运行良好的安装程序,其结果程序抛出了相同的错误。

  • 共有3个答案

    丰博
    2023-03-14

    我现在已经用一个几乎是自建的解决方案解决了这个问题。最后,我有一些文件夹和文件可以压缩和发送,它们不需要java安装,可以通过双击.bat文件来运行。以下程序对我有效:

    >

  • 从头开始创建新的渐变项目

    将所有模块/代码添加到 src/主/java 文件夹中

    创建一个调用main-方法的AppLauncher.java

    将所有 fxml/css 从其中一个 Java 文件夹移动到资源文件夹

    确保对fxml-/css-files的调用没有被错误重构,并使用以下代码:

    //Main start method
    Parent root = FXMLLoader.load(new File("fxml/main.fxml").toURI().toURL());
    
    //Other FXML loading operations
    FXMLLoader loader = null;
    try { loader = new FXMLLoader(new File("fxml/GRAPHISO_proof.fxml").toURI().toURL()); }
    ...
    

    对于样式表:

    scene.getStylesheets().add("file:///" + new File("css/text-field-red-border.css").getAbsolutePath().replace('\\', '/'));
    
      < li >使用以下结构在src/main/java文件夹中创建< code > module-info . Java :
    module XYZ {
        requires javafx.controls;
        requires javafx.graphics;
        requires java.desktop;
        requires javafx.fxml;
        requires javafx.base;
    
        opens main.controller to javafx.fxml;
        //Open ALL controller-modules (all of my modules have a controller-submodule, e.g. main/controller, dlog/controller, graphiso/controller, ...) to javafx.fxml
        //...
    
        exports main;
    }
    

    >

  • 确保分级/包装器/分级包装的属性设置为不太旧的分级版本(分布网址 services.gradle.org/distributions/gradle-6.3-bin.zip=

    使用这个作为你的构建.

    buildscript {
        repositories {
            maven {
                url "https://plugins.gradle.org/m2/"
            }
        }
        dependencies {
            classpath 'org.openjfx:javafx-plugin:0.0.8'
            classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
        }
    }
    
    plugins {
        id 'java'
        id 'org.beryx.jlink' version '2.19.0'
    }
    
    apply plugin: 'org.openjfx.javafxplugin'
    apply plugin: 'com.github.johnrengelman.shadow'
    
    group 'org.example.abc'
    version '1.0'
    
    sourceCompatibility = 1.14
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
    
    javafx {
        sdk = 'C:\\Program Files\\Java\\javafx-sdk-14.0.1'
        modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.base' ]
    }
    
    jlink {
        mainClassName = 'main.AppLauncher'
        launcher {
            name = 'Whatever you want as name'
        }
    }
    
    tasks.jlink.doLast {
        copy {
            from('src/main/resources')
            into("$buildDir/image/bin")
        }
        copy {
            from 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\glass.dll',
                 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\javafx_font.dll',
                 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_d3d.dll',
                 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_sw.dll'
            into("$buildDir/image/bin")
        }
    }
    

    请注意我是如何在任务中包含一些 dll 文件的。没有它们,程序会不断崩溃,并引用量子控制器。

    • 安装 openjdk-14.0.1 二进制文件并相应地设置 %JAVA_HOME%,还要安装 openjfx-14.0.1 (如上所述,程序需要一些 DLL)

  • 刘明朗
    2023-03-14

    我遇到同样的问题已经有一段时间了;IntelliJ无法自行部署FX应用程序,这是一个相当大的问题。

    如果您还没有这样做的话,我建议您首先创建一个标准的Jar文件,并从命令行运行它以及您需要的附加参数:

    java --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules javafx.controls,javafx.fxml -jar your-jar.jar
    

    这只是为了验证它是否启动和运行。我了解到,仅仅因为它在IDE中运行,并不意味着运行JAR时不会弹出错误——最好先验证一下。

    然后,有许多方法可以实现你想要的,所有这些方法都有不同程度的简单和整洁。

    1. 如您所说,您可以运行.bat文件来启动它。这是最简单的方法。
    2. 您可以为其创建一个新的Windows快捷方式,在目标字段中,将本应放置在 bat 文件中的命令放在其中,但包括 javaw 的完整文件路径.exe和 jar 文件的完整路径。这个解决方案比上面的更优雅,但仍然需要两个文件(你的jar和快捷方式)
    3. 您可以尝试使用名为“启动4j”的应用程序。它将 jar 和 JVM 的必要组件打包到 exe 文件中,您也可以在其中指定 VM 参数。这有一个额外的好处,即客户端不需要特定版本的Java,因为您基本上将其包含在文件中。
    4. 如果你真的只想打包jar文件,这是最复杂的方法,但这是可能的。我通过以下技术取得了成功:

    首先,正常编译JavaFX jar,以下称为fx.jar。然后,创建一个非JavaFX项目,以下称为nonfx.jar。将fx.jar放在< code>nonfx的< code>src文件夹中。当nonfx运行时,它应该从自己的归档文件中提取fx.jar,然后运行一个命令,用必要的VM参数打开fx.jar。本质上,nonfx是fx.jar的容器。为了在fx.jar关闭时删除它,我建议创建一个Windows任务,从fx.jar中删除它。

    这种方法相当烦人且容易出错,但它确实有效。可能有更好的方法来与格拉德做到这一点。在 fx:deploy 再次包含在 IntelliJ 中之前,解决方法是我们拥有的最好的方法。

    柯锋
    2023-03-14

    好的,我将尝试演示如何仅使用jlink实现这一点。假设我们在目录“C:\Users\Alexiy\IdeaProjects\AnotherBuildTool\rundir”中有一个示例项目。其结构为:

    /rundir
    --classes [compilation output]
    --source  [source code]
    --images  [runtime image output]
    

    我有一个类“source \ io \ github \ alexiyorlov \ calculator \ program . Java”:

    package io.github.alexiyorlov.calculator;
    
    import javafx.application.Application;
    import javafx.stage.Stage;
    import java.nio.file.Path;
    public class Program extends Application {
    
       @Override
       public void start(Stage primaryStage) throws Exception {
           System.out.println("I'm a simple application");
           primaryStage.show();
       }
    }
    

    以及适当的“source\module info.java”:

    module io.github.alexiyorlov{
       requires javafx.controls;
       requires javafx.graphics;
       exports io.github.alexiyorlov.calculator;
    }
    

    如果我想用这个做一个运行时图像,jlink命令的语法将是这样的:

    jlink--Launcher[启动脚本的名称]=[对主类的引用]--module-path'[项目依赖项jars编译输出目录的分离列表]'--add-dule[我的模块参考]--compress=2--输出[生成的运行时映像的目录]

    因此,对于我的示例项目,它解析为以下命令:

    jlink 
    --launcher launch=io.github.alexiyorlov/io.github.alexiyorlov.calculator.Program 
    --module-path 'C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-controls\11.0.2\javafx-controls-11.0.2-win.jar;C:\Users\Alexiy\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0-M1\junit-jupiter-engine-5.7.0-M1.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-base\11.0.2\javafx-base-11.0.2.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-base\11.0.2\javafx-base-11.0.2-win.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-graphics\11.0.2\javafx-graphics-11.0.2.jar;C:\Users\Alexiy\.m2\repository\dev\buildtool\json-tools\0.1.0\json-tools-0.1.0.jar;C:\Users\Alexiy\IdeaProjects\AnotherBuildTool\rundir\org\openjfx\javafx\11.0.2\javafx-11.0.2/.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-controls\11.0.2\javafx-controls-11.0.2.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-graphics\11.0.2\javafx-graphics-11.0.2-win.jar;C:\Users\Alexiy\IdeaProjects\AnotherBuildTool\rundir/classes' 
    --add-modules io.github.alexiyorlov 
    --compress=2 
    --output .\images\0.0.1
    

    它将在目录“image\0.0.1”中创建一个图像,启动脚本为“0.0.1\bin\Laun”。

    注意,我使用了一种自动化的方法来获取--module-path的正确参数;确保在其中包含类输出目录。

    --addmodules指定要包含应用程序的哪些模块。

    - output指定一个目录来存放图像的所有文件

    - launcher在“=”后指定启动脚本的名称和对主类的正确引用。

    - compress=2表示对图像应用ZIP压缩。

    请随时向我索取更多信息。

     类似资料:
    • 我有一个Java项目已经准备就绪,但我在最后一个障碍上绊倒了。该程序在IDE中运行良好,但在我运行mvn clean install并成功创建目标jar后,应用程序在命令行和IDE中都会失败。我可以通过在IDE中进行重建,使其在IDE中再次运行。 还有其他人经历过类似的事情吗? mvn清洁安装后的错误是 它发生故障的线路如下所示: 如果我从IDE中重建,那么变量到达这里时不是null,但在mvn命

    • 目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个

    • 我使用netbans 10.0创建了一个新的CodeNameOne项目,但我无法运行它 输出: /home/autonome/NetBeansProjects/javaWorkSpace/CodenameOne7/build。xml:17:taskdef类com所需的类。代号1。建筑客户找不到GenerateGuiSources:javax/xml/bind/JAXBException,使用类加载

    • 我希望能够运行SpringBoot:build映像,并让它从本地Artifactory服务器而不是docker中提取paketobuildpack。木卫一。我希望插件使用docker配置文件作为我的凭证,而不是在pom文件中硬编码。 这个作品: 当我在没有上面的docker块的情况下运行时,我得到以下错误: 我的docker/config。json具有以下配置: 我可以成功地运行docker bu

    • 问题内容: 我尝试在构建映像的同时使用Docker安装软件,然后得到了。 我使用的Dockerfile 有没有一种方法可以在Dockerfile中运行docker命令来创建映像? 问题答案: 您的问题不在于Docker命令,因为它在错误消息中表示您的Docker守护程序未运行,或者由于某些配置问题而无法连接到它。 您刚刚安装了Docker吗?您是否完成了《安装指南》中的所有步骤? 您可以使用或来测

    • 我制作了一个应用程序,它将获取数据库的列名,并在运行时基于数据库的列名创建一个jlabel和jtextfield。 下面是代码片段:我在这里使用Netbeans。。。 这将是示例输出。 引用JTextFields的行。。 但是,我无法获取在jtextfields中输入的值。我试过使用下面的代码。但运气不好。感谢您的帮助。