将IntelliJ中的JavaFX11实现从“更改为”;使用IDE中的jvm选项构建和运行”;至;“创建运行时映像”; 编辑#3(解决方案)

将IntelliJ中的JavaFX11实现从“更改为”;使用IDE中的jvm选项构建和运行”;至;“创建运行时映像”; 编辑#3(解决方案),java,maven,gradle,intellij-idea,javafx,Java,Maven,Gradle,Intellij Idea,Javafx,我没有使用任何建议的答案来解决这个问题。最后,我有一些文件夹和文件可以压缩并发送,它们不需要java安装,可以通过双击.bat文件来运行。以下程序对我有效: 从头开始创建一个新的gradle项目 将所有模块/代码添加到src/main/java文件夹中 创建一个调用main方法的AppLauncher.java 将其中一个java文件夹中的所有fxml/css移到resources文件夹中 确保对fxml-/css文件的调用没有被错误重构,并使用以下代码: //主启动方法 父根=fxmloa

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

  • 从头开始创建一个新的gradle项目

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

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

  • 将其中一个java文件夹中的所有fxml/css移到resources文件夹中

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

//主启动方法
父根=fxmloader.load(新文件(“fxml/main.fxml”).toURI().toul());
//其他FXML加载操作
FXMLLoader=null;
尝试{loader=newFXMLloader(新文件(“fxml/GRAPHISO_-proof.fxml”).toURI().tour());}
...
对于样式表:

scene.getStylesheets().add(“file:///”+新文件(“css/text field red border.css”).getAbsolutePath().replace(“\\”,“/”);
  • 使用以下结构在src/main/java文件夹内创建
    module info.java
模块XYZ{
需要javafx.controls;
需要javafx.graphics;
需要java.desktop;
需要javafx.fxml;
需要javafx.base;
将main.controller打开到javafx.fxml;
//打开所有控制器模块(我的所有模块都有一个控制器子模块,例如main/controller、dlog/controller、graphiso/controller等)到javafx.fxml
//...
主要出口产品;
}
  • 确保将gradle/wrapper/gradle-wrapper.properties设置为不太旧的gradle版本(
    distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

  • 将其用作您的build.gradle:

注意我是如何在tasks.jlink.doLast中包含一些dll文件的。如果没有它们,程序会不断崩溃并引用QuantumRenderer

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

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

C:\Program Files\Java
的内部,我安装了:

  • javafx-sdk-11.0.2
  • jdk-13.0.2
我将IntellJ的“运行配置”中的VM选项配置为
——模块路径“C:\Program Files\Java\javafx-sdk-11.0.2\lib”——添加模块javafx.controls、javafx.fxml
,并将主类设置为“Main.Main”

我的项目结构如下所示:

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

最初,我尝试获取一个.jar文件,该文件可以在Windows和Linux上运行,无需任何其他参数。经过一番阅读后,我认为这不是一个干净的解决方案,许多资料表明,在现代解决方案中,.jar文件将与包含所有必要参数的.bat/.sh文件一起放在一起

我的问题是:如何最好地继续,我需要哪些配置/附加文件来将这个“在IDE中单击以运行”项目转换为可以通过电子邮件或类似方式共享的“独立应用程序”

我试图通过IntelliJ(以下)创建一个新的gradle项目,并将粘贴的源文件复制到src/main/java中。然后,我尝试了提供的build.gradle文件,之后没有工作,我做了一些由各种博客/论坛/等建议的更改。没有一个允许我通过IntelliJ或从命令行运行项目

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


编辑#1(JPackageScriptFX) 我已经查看了JPackageScriptFX链接。现在我得到了一个在我的机器上运行的安装程序(使用
mvn clean install
),但是当运行生成的可执行文件时,我收到一条错误消息,上面说“未能启动JVM”

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

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

  • 创建了一个新的IntelliJ maven项目,名为“单身汉maven”

  • 删除了初始src文件夹

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

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

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

我的配置文件:

  • 新的项目结构:

  • pom.xml(项目级,学士学位):

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

  • build_app.bat:


编辑#2 我尝试从build_app.bat文件中的jpackage参数中删除
--runtime image target/java runtime^
,以便让jpackage决定要包含的内容。这增加了成本
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")
    }
}
java --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules javafx.controls,javafx.fxml -jar your-jar.jar
/rundir
--classes [compilation output]
--source  [source code]
--images  [runtime image output]
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();
   }
}
module io.github.alexiyorlov{
   requires javafx.controls;
   requires javafx.graphics;
   exports io.github.alexiyorlov.calculator;
}
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
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")
    }
}