使用gradle 6.3、OpenJDK 14和OpenJFX 14部署JavaFX应用程序。

问题描述 投票:1回答:1

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

我曾经在Netbeans 11下用JDK 8制作JavaFX应用程序,过程很简单。

  1. 制作应用程序
  2. 清洁和建设
  3. 在 dist 文件夹中寻找这个 jar (当我点击它时,它可以完美地工作)
  4. 使用Launch4j将其转换为exe
  5. Voilà!

由于我要迁移到OpenJDK 14,我想确保我可以部署我正在做的应用程序,所以我创建了一个应用程序,当我运行它时,一切都正常(在IntelliJ中)。我看到一些关于如何用gradle部署javafx应用的教程,于是我想到了这个过程。

  1. 在gradle窗口(屏幕右上方),点击distribution > distZip。
  2. 在build/distibutions中寻找生成的ZIP文件,并解压它
  3. 你会发现一个 自由基 文件夹中。在... 文件夹,我发现了一个 .bat 我的项目的文件,当点击它时,我的应用程序启动,一切工作正常。在 自由基 文件夹中,我找到了我在项目中使用的所有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行是应用程序创建德比数据库的结果(工作完美),但是当运行应用程序的时候,我得到了一些异常。--module-path "C:\Program Files\Java\javafx-sdk-14.0.1\lib" --add-modules javafx.controls,javafx.fxml,javafx.base,javafx.graphics 但我得到了同样的异常。

有3种解决方案,我都不知道。

  1. 解决这个异常
  2. 试着转换一下 .bat 归档 .exe 档案
  3. 新的解决方案

EDIT: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) }
    }
}

谢谢你的帮助!

java gradle javafx javafx-11
1个回答
0
投票

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

所以我尝试了一些解决方案,让我的 .jar 文件的工作,我终于找到了一个。

  1. 添加到你的顶部 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)

  1. 在gradle窗口中(intelliJ IDE的右上方),单击 分布> shadowDistZip
  2. 前往 构建分布 你会发现一个ZIP文件({projectName}-shadow-{version}),解压它。
  3. 打开这个文件夹,你会发现 自由基 文件夹,转到 自由基 文件夹中的jar。
  4. 你会在那里找到你的 .jar 这应该工作像你的期望。

我还在寻找如何使它.exe,所以如果有人有一个建议,欢迎!

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

我终于成功创建了一个 .exe 的文件。我用了 Launch4j (是的,它与Java > 11一起工作)。下面是简单的步骤。

  1. 下载 Launch4j 先安装它(不要运行它,它不会工作)。
  2. 进入Launch4j文件,你会看到一个叫 launch4j.jar 文件,运行它并选择 基础 标签
  3. 选择保存输出的路径(确保在最后写上.exe)。
  4. 选择您的 .jar 档案是

Quick example

  1. 现在去 JRE 选项卡,在Min JRE版本中选择11.0.1以确保它只用Java > 11开始,在Max JRE版本中选择你想要的最大Java版本(在我的例子中,最后的版本是14.0.1)。

JRE example

  1. 现在点击顶部的齿轮,然后将配置文件保存在你想要的地方,然后 "喔!"你的.exe文件应该可以运行了。你的.exe文件现在应该可以完美运行了。

P.S.: 你可以用Launch4j添加一个图标,清单文件和其他许多东西,我只是解释了一个最简单的例子,让你们可以让它工作,剩下的就看你们自己了:)

如果有其他的解决方案,请和我们分享,很多人都在为JDK 14的可执行文件而苦恼。

谢谢大家

© www.soinside.com 2019 - 2024. All rights reserved.