java - 使用Gradle 6.3,OpenJDK 14和OpenJFX 14部署JavaFX应用程序

原文 标签 java gradle javafx javafx-11

我正在使用带有IntelliJ的gradle 6.3,OpenJDK 14和OpenJFX 14开发JavaFX应用程序,我想部署它(创建exe文件)。

我曾经使用NetBeans 11下的JDK 8制作JavaFX应用程序,过程很简单:

  • 使应用程序
  • 清理并构建
  • 在dist文件夹中查找jar(当我单击它时可以完美工作)
  • 使用Launch4j将其转换为exe
  • Voilà!

  • 由于我要迁移到OpenJDK 14,因此我想确保可以部署自己制作的应用程序,因此我创建了一个应用程序,并且在运行它时(在IntelliJ中)一切正常。我看到了一些有关如何使用gradle部署javafx应用程序的教程,我想到了以下过程:
  • 在gradle窗口(在屏幕的右上角)上,单击发行版> distZip
  • 在build \ distibutions中查找生成的ZIP文件,并将其解压缩为
  • 您会找到一个 bin lib 文件夹:在 bin 文件夹中,我找到了我项目的 .bat 文件,单击该文件,我的应用程序启动,一切正常。在 lib 文件夹中,我找到了我在项目中使用过的所有jar文件以及{project-name} .jar,当我单击它时什么也没有发生。

  • 我尝试使用命令行运行它,这是我得到的:
        C:\Users\Admin\Documents\SmartDoc\build\distributions\SmartDoc-1.0\SmartDoc-1.0\lib>java -jar SmartDoc-1.0.jar
    Table PATIENT created successfully !
    Table DOSSIER_MEDICAL created successfully !
    Table ORDONNANCE created successfully !
    Table RENDEZ_VOUS created successfully !
    Table SALLE_ATTENTE created successfully !
    Exception in Application start method
    Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
            at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
            at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
            at java.base/java.lang.Thread.run(Thread.java:832)
    Caused by: javafx.fxml.LoadException:
    file:/C:/Users/Admin/Documents/SmartDoc/build/distributions/SmartDoc-1.0/SmartDoc-1.0/lib/SmartDoc-1.0.jar!/main.fxml:27
    
        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
        at com.smartdoc.gui.Launch.start(Launch.java:27)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
        ... 1 more
    Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
            at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:262)
            at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:54)
            at javafx.fxml.FXMLLoader$Element.applyProperty(FXMLLoader.java:520)
            at javafx.fxml.FXMLLoader$Element.processValue(FXMLLoader.java:370)
            at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:332)
            at javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:242)
            at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:775)
            at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2838)
            at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2557)
            ... 17 more
    Caused by: java.lang.reflect.InvocationTargetException
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:564)
            at com.sun.javafx.fxml.ModuleHelper.invoke(ModuleHelper.java:100)
            at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:258)
            ... 25 more
    Caused by: java.lang.UnsupportedOperationException: Cannot resolve 'fa-user-plus'
            at org.kordamp.ikonli.javafx.IkonResolver.resolveIkonHandler(IkonResolver.java:62)
            at org.kordamp.ikonli.javafx.FontIcon.setIconLiteral(FontIcon.java:239)
            ... 31 more
    

    前5行是应用程序创建derby数据库(完美运行)的结果,但是在运行该应用程序时,我遇到了一些例外。
    我也尝试使用--module-path "C:\Program Files\Java\javafx-sdk-14.0.1\lib" --add-modules javafx.controls,javafx.fxml,javafx.base,javafx.graphics运行,但出现了相同的异常。

    我不知道有3种解决方案:
  • 解决此异常
  • 尝试将该 .bat 文件转换为 .exe 文件
  • 一种新的解决方案

  • 编辑:
    build.gradle文件:
    plugins {
        id 'java'
        id 'application'
        id 'org.openjfx.javafxplugin' version '0.0.8'
    }
    
    group 'com.smartdoc'
    version '1.0'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile 'com.calendarfx:calendar:11.8.3'
        compile 'com.calendarfx:view:11.8.3'
        compile 'org.kordamp.ikonli:ikonli-core:11.4.0'
        compile 'org.kordamp.ikonli:ikonli-javafx:11.4.0'
        compile 'org.kordamp.ikonli:ikonli-fontawesome-pack:11.4.0'
        compile 'com.jfoenix:jfoenix:9.0.9'
        compile group: 'org.apache.derby', name: 'derby', version: '10.15.2.0'
        compile group: 'org.apache.derby', name: 'derbyclient', version: '10.15.2.0'
        compile group: 'org.apache.derby', name: 'derbynet', version: '10.15.2.0'
    
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
    
    javafx {
        version = "14.0.1"
        modules = ['javafx.controls','javafx.fxml']
    }
    
    mainClassName = "$moduleName/com.smartdoc.Main"
    
    jar {
        manifest {
            attributes "Main-Class": "$mainClassName"
        }
    
        from {
            configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
        }
    }
    

    谢谢你的帮助!

    最佳答案

    更新1:制作一个有效的.jar文件

    因此,我尝试了一些解决方案以使 .jar 文件正常工作,最后我找到了THE ONE:

  • 添加到 build.gradle 的顶部:
  • buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
        }
    }
    
    plugins {
        id 'application'
        id 'org.openjfx.javafxplugin' version '0.0.8'
        id 'com.github.johnrengelman.shadow' version '5.2.0'
    }
    
    apply plugin : 'com.github.johnrengelman.shadow'
    

    (如您所见,我使用了Gradle Shadow Plugin)
  • 在gradle窗口中(在intelliJ IDE的右上角),单击发行版> shadowDistZip
  • 转到 build \ distributions ,您将找到一个ZIP文件({projectName} -shadow- {version}),将其解压缩。
  • 打开文件夹,您会找到 bin lib 文件夹,转到 lib 文件夹以获取jar。
  • 您会在其中找到像您期望的那样辛苦工作的 .jar

  • 我仍在寻找如何制作.exe,因此,如果有人有建议,欢迎您!

    更新2:使用Launch4j制作.exe文件

    我终于设法从之前创建的jar中创建了一个 .exe 文件:我使用了Launch4j(是的,它适用于Java> 11)。简单的步骤如下:
  • 首先下载Launch4j并安装(不要运行它,它不会工作)
  • 转到Launch4j文件,您将看到一个launch4j.jar文件,运行该文件并选择基本选项卡
  • 选择保存输出的路径(确保在末尾写入.exe)
  • 选择 .jar 文件为
  • 的路径

    Quick example
  • 现在转到 JRE 选项卡,在Min JRE版本中选择11.0.1以确保它仅以Java> 11开头,然后在Max JRE版本中选择所需的最大Java版本(在我的情况下为最后一个版本)是14.0.1

  • JRE example
  • 现在,单击顶部的齿轮,然后将配置文件保存到任何您想要的位置,然后Voilà!您的.exe文件现在应该可以正常运行了。

  • P.S .: 您可以使用Launch4j添加图标,清单文件和许多其他内容,我只是向您说明了最简单的示例,以便大家可以使用它,其余的取决于您:)

    如果还有其他解决方案,请与我们分享,许多人都在JDK 14的可执行文件中受苦。

    谢谢!

    相关文章:

    java - 在使用PreparedStatement的同时使用RabbitMQ设计Java OSGi应用程序

    java - 如何从sqlite读取blob数据并显示它

    repository - 在Gradle构建中配置多个上传存储库

    android - Android Studio 3 + Gradle 4.0 + shrinkResources + libraryProject =无法在项目中找到匹配的配置

    dependency-injection - Afterburner.fx fxml加载错误

    java - SLF4J,通用记录,控制台输出

    java - Java:返回嵌套列表的类型

    java - 使用自定义主要 Artifact 发布Java库

    java - 将背景图片设置为与Java应用中的窗口/屏幕相同的大小

    java - 在JavaFX组件(如Swing)中使用HTML