gpt4 book ai didi

java - 将IntelliJ中的JavaFX 11实现从 “build and run with jvm options inside IDE”更改为 “create runtime image”

转载 作者:行者123 更新时间:2023-12-03 05:04:20 24 4
gpt4 key购买 nike

编辑#3(解决方案)

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

  • 从头开始创建新的gradle项目
  • 将所有模块/代码添加到src / main / java文件夹
  • 创建一个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 / wrapper / gradle-wrapper.properties设置为gradle的不太旧版本(distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip)
  • 将此用作您的build.gradle:
  • 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")
    }
    }

    请注意我如何在task.jlink.doLast中包含一些dll文件。没有它们,程序将继续崩溃并引用QuantumRenderer。
  • 安装openjdk-14.0.1二进制文件并相应地设置%JAVA_HOME%,还安装openjfx-14.0.1(程序需要如上所述的一些DLL)


  • 原始问题

    我试图通过仅使用IntelliJ中的“运行配置”功能从JavaFX 11中实现的项目中创建运行时镜像。在我看来,这里的一个大问题是我几乎不了解maven / gradle,并且这些构建工具对于这一步骤至关重要。

    我已经安装了 C:\Program Files\Java:
  • javafx-sdk-11.0.2
  • jdk-13.0.2

  • 我将IntellJ的“运行配置”中的VM选项配置为 --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules javafx.controls,javafx.fxml,并将Main Class设置为“main.Main”。

    我的项目结构如下: Project folder structure

    高亮显示的Main.java是通常的Main文件(扩展Application,在main内部调用launch(args))。它可以加载位于其他程序包中的其他窗口。它是 而不是,它是不会扩展Application并调用实际主文件的启动程序文件(如有关gradle构建的一些解决方案所建议的)。

    最初,我尝试获取一个.jar文件,该文件可以在Windows和Linux上运行而无需任何其他参数。经过一番阅读后,我发现这不是一个干净的解决方案,许多消息来源指出,在现代解决方案中,.jar文件将放在一起并与包含所有必要参数的.bat / .sh文件一起提供。

    我的问题是:如何最好地进行操作,我需要哪些配置/其他文件才能将这个“单击以运行内部IDE”项目转换为可以通过电子邮件或类似方式共享的“独立应用程序” ?

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

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

    编辑#1(JPackageScriptFX)

    我看过JPackageScriptFX-link。现在,我得到一个可以在我的机器上运行的安装程序(使用 mvn clean install),但是在运行生成的可执行文件时,我收到一条错误消息,提示“无法启动JVM”。

    到目前为止,我所做的是:
  • 安装了jdk-14.0.1并设置了JAVA_HOME,安装了wix311
  • 创建了一个新的IntelliJ maven项目,名为“bachelor_maven”
  • 删除了初始的src文件夹
  • 在结果src / main / java文件夹
  • 中添加了新模块“ZKP_Inspector”和我的旧模块
  • 添加并编辑了src / main / logo / windows / duke.ico,两个pom.xml文件和JPackageScriptFX的build_app.bat
  • 实现了调用Main.java的AppLauncher.java

  • 我的配置文件:
  • 新项目结构:Imgur
  • pom.xml(项目级别,单例汉):Pastebin
  • pom.xml(模块级别,ZKP_Inspector):Pastebin
  • build_app.bat:Pastebin


  • 编辑#2

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

    我还下载了JMOD文件,并在build_app.bat的jlink任务中将它们用作提示 here

    所以我用替换了 --add-modules %detected_modules%,%manual_modules% ^ --module-path "C:\Program Files\Java\javafx-jmods-11.0.2" --add-modules %detected_modules%,%manual_modules%,javafx.controls,javafx.fxml
    这产生了另一个运行良好的安装程序,其安装程序引发了相同的错误。

    最佳答案

    好吧,我将尝试展示如何仅使用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'[项目依赖项jar的单独列表+编译输出目录]'--add-modules [我的模块引用] --compress = 2 --output [生成的运行时镜像的目录]


    因此,对于我的示例项目,它解析为以下命令:
    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

    它将在目录“images \ 0.0.1”中使用启动脚本“0.0.1 \ bin \ launch”创建镜像。

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

    --add-modules指定应用程序要包括的模块。

    --output指定用于放置镜像的所有文件的目录。

    --launcher指定启动脚本的名称,并在'='之后指定对主类的正确引用。

    --compress = 2使其可以对图像应用ZIP压缩。

    随时要求我提供更多信息。

    关于java - 将IntelliJ中的JavaFX 11实现从 “build and run with jvm options inside IDE”更改为 “create runtime image”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62054292/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com