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

JavaFX 11:使用Gradle创建一个jar文件

史鸿运
2023-03-14
group 'Project'
version '1.0'
apply plugin: 'java'
sourceCompatibility = 1.11

repositories {
    mavenCentral()
}

def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
    platform = 'win'
} else if (currentOS.isLinux()) {
    platform = 'linux'
} else if (currentOS.isMacOsX()) {
    platform = 'mac'
}
dependencies {
    compile "org.openjfx:javafx-base:11:${platform}"
    compile "org.openjfx:javafx-graphics:11:${platform}"
    compile "org.openjfx:javafx-controls:11:${platform}"
    compile "org.openjfx:javafx-fxml:11:${platform}"
}

task run(type: JavaExec) {
    classpath sourceSets.main.runtimeClasspath
    main = "project.Main"
}

jar {
    manifest {
        attributes 'Main-Class': 'project.Main'
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.controls,javafx.fxml'
        ]
    }
}

run {
    doFirst {
        jvmArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.controls,javafx.fxml'
        ]
    }
}

你知道我该怎么做吗?

共有1个答案

蓟清野
2023-03-14

对于Java/JavaFX11,shadow/fat jar将无法工作。

正如你可以在这里读到的:

这个错误来自java.base模块中的sun.launcher.launcherHelper。这样做的原因是Main app扩展了application并有一个Main方法。如果是这种情况,launcherhelper将检查javafx.graphics模块是否作为命名模块出现:

Optional<Module> om = ModuleLayer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);
java --module-path <path-to>/javafx-sdk-11/lib \
   --add modules=javafx.controls -jar my-project-ALL-1.0-SNAPSHOT.jar

这意味着,您必须安装JavaFX SDK(每个平台)来运行使用maven Central的JavaFX依赖项的jar。

作为另一种选择,您可以尝试使用jlink来创建一个轻量级的JRE,但是您的应用程序需要是模块化的。

此外,您还可以使用Javapackager为每个平台生成一个安装程序。请参阅http://openjdk.Java.net/jeps/343,它将为Java12生成一个打包器。

public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");   
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(new StackPane(l), 400, 300);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}
public class Main {

    public static void main(String[] args) {
        HelloFX.main(args);
    }
}

并且在生成文件中:

mainClassName='javafx11.Main'
jar {
    manifest {
        attributes 'Main-Class': 'javafx11.Main'
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

现在您可以运行:

./gradlew run

./gradlew jar
java -jar build/libs/javafx11-1.0-SNAPSHOT.jar
 类似资料:
  • 我试图使用一个jar生成一个包含clojure jar文件和java类文件的jar文件:创建一个jar文件,用于从java/clojure执行 按照指令,我可以使用生成目录。按照指示,我替换了java源代码,并添加了ThingOne-1.0.0-SNAPSHOT-standalone.jar 运行,它构建jar文件时没有出现错误,但是当我尝试执行jar文件时,收到了错误消息。 什么可能是错的?

  • 我有个问题希望有人能帮我解决。 我有两个java项目,其中一个我们将称之为CORE,它包含一组通用功能的类,并向我们的DB提供hibernate接口/DAO等。 其他项目需要CORE以便与我们的DB交互并使用公共的CORE功能。 现在,我已经使用Gradle创建了一个Jar文件,并通过IDE将该Jar文件导入到其他项目中,所有内容都可以正确编译。 现在我明白了,当创建一个Jar文件时,您需要提供一

  • 问题内容: 到目前为止,我已经通过Eclipse的“导出…”功能创建了可运行的JAR文件,但是现在我切换到IntelliJ IDEA和Gradle进行构建自动化。 这里的一些文章建议使用“应用程序”插件,但这并不能完全导致我期望的结果(只是JAR,没有启动脚本或类似的东西)。 如何通过Eclipse的“导出…”对话框获得相同的结果? 问题答案: 可执行jar文件只是清单中包含Main- Class

  • 我使用spring mvc、gradle和Tomcat创建了一个java rest服务。我想从这个项目中创建一个war来部署在tomcat中,我想从所有模型包中创建一个jar。我设法制造了战争,而且效果很好。但是我不知道如何从指定的类中创建一个jar来用作客户端jar。我知道我必须使用include('com/a/b/**/model/**')来选择类,但仅此而已。这个jar我想安装在。M2本地回

  • 我使用以下步骤文件创建了gradle项目的jar库(即没有主类)- 这是在没有主类的情况下构建jar的正确方法吗?因为当我尝试将其导入另一个Gradle项目时,我会出错。假设jar文件名为test。罐子 我将jar添加到src/libs/test.jar 内置。我添加了gradle依赖项实现文件树(dir:'libs',include:['*.jar']) 右键单击测试。震击器- 文件- 仍在获取

  • 我想将几个罐子组合成一个Uberjar。 在Java中,我知道如何使用这两个工具来遮蔽依赖关系: https://maven.apache.org/plugins/maven-shade-plugin/ https://plugins.gradle.org/plugin/com.github.johnrengelman.shadow 但我有一个web服务,需要采用动态类路径并从中创建uberjar