【问题标题】:JavaFX App working under Intellij but not as jarJavaFX App 在 Intellij 下工作但不是 jar
【发布时间】:2020-02-17 14:30:01
【问题描述】:

我为一个学校项目编写了一个 JavaFX 程序。没什么特别的。但从一开始我就犯了一个大错误。我为该项目选择了 SDK 版本 1.8。 现在我已经完成了,我尝试使用构建工件获取我的项目的 jar。那行得通,但是当我打开罐子时,什么也没有发生。在意识到我使用了 SDK 1.8 之后,我尝试使用 JavaFX SDK 13 和 JDK 13 将所有内容复制到一个新项目中。 但我不能以这种方式运行它。只是得到“通常”的 JavaFX 错误:

    /Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home/bin/java --module-path /Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib --add-modules=javafx.controls,javafx.fxml --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=51795:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/target/classes:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx-swt.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.base.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.controls.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.fxml.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.graphics.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.media.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.swing.jar:/Library/Java/JavaVirtualMachines/javafx-sdk-13.0.1/lib/javafx.web.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/appdirs-1.0.3.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/slf4j-api-1.7.25.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/jna-platform-4.5.2.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/jna-4.5.2.jar:/Users/marcelschalk/Downloads/sqlite-jdbc-3.27.2.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/javafx-maven-plugin-0.0.3.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-plugin-api-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-model-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-artifact-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/org.eclipse.sisu.plexus-0.3.3.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/cdi-api-1.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/jsr250-api-1.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-utils-3.1.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-classworlds-2.5.2.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-java-0.9.11.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/asm-7.0-beta.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/qdox-2.0-M9.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-archiver-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-io-3.0.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/commons-io-2.6.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/commons-compress-1.16.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/objenesis-2.6.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/snappy-0.4.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/xz-1.8.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/commons-exec-1.3.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/mojo-executor-2.3.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/slf4j-api-1.7.22.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/slf4j-simple-1.7.22.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-core-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-settings-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-settings-builder-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-interpolation-1.25.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-sec-dispatcher-1.4.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-cipher-1.4.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-builder-support-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-repository-metadata-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-model-builder-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-resolver-provider-3.6.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-resolver-impl-1.3.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-resolver-api-1.3.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-resolver-spi-1.3.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-resolver-util-1.3.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/maven-shared-utils-3.2.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/org.eclipse.sisu.inject-0.3.3.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/guice-4.2.1-no_aop.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/aopalliance-1.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/guava-25.1-android.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/jsr305-3.0.2.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/checker-compat-qual-2.0.0.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/error_prone_annotations-2.1.3.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/j2objc-annotations-1.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/animal-sniffer-annotations-1.14.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/javax.inject-1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/plexus-component-annotations-1.7.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/commons-lang3-3.8.1.jar:/Users/marcelschalk/OneDrive - stud.hs-merseburg.de/Proggen/Manager/lib/jfoenix-8.0.8.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-controls/13/javafx-controls-13.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-controls/13/javafx-controls-13-mac.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-graphics/13/javafx-graphics-13-mac.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-base/13/javafx-base-13.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-base/13/javafx-base-13-mac.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-fxml/13/javafx-fxml-13.jar:/Users/marcelschalk/.m2/repository/org/openjfx/javafx-fxml/13/javafx-fxml-13-mac.jar:/Users/marcelschalk/.m2/repository/net/harawata/appdirs/1.0.3/appdirs-1.0.3.jar:/Users/marcelschalk/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar:/Users/marcelschalk/.m2/repository/net/java/dev/jna/jna-platform/4.5.2/jna-platform-4.5.2.jar:/Users/marcelschalk/.m2/repository/net/java/dev/jna/jna/4.5.2/jna-4.5.2.jar:/Users/marcelschalk/.m2/repository/org/slf4j/slf4j-simple/1.7.28/slf4j-simple-1.7.28.jar" sample.Main
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/marcelschalk/OneDrive%20-%20stud.hs-merseburg.de/Proggen/Manager/lib/slf4j-simple-1.7.22.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/marcelschalk/.m2/repository/org/slf4j/slf4j-simple/1.7.28/slf4j-simple-1.7.28.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
Exception in Application start method
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:567)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    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:567)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
    at sample.Main.start(Main.java:53)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
Exception running application sample.Main

Process finished with exit code 1

我现在真的不知道该怎么办......

这些是在 JDK 1.8 下的 Intellij 中工作的文件: https://drive.google.com/file/d/1DTtntPrh-9pkgrwyrHi9im3B2IAYeZoa/view?usp=sharing

这是不工作的重建项目: https://drive.google.com/file/d/1gPRzxV32OAUZct4w1lF-Y3WTv7lR-BCF/view?usp=sharing

项目结构:

【问题讨论】:

  • “刚刚出现‘常见的’JavaFX 错误”——请编辑您的问题并显示该异常的整个堆栈跟踪,包括所有“原因:”部分。
  • 问题本身必须包含minimal reproducible example。链接到另一个站点或此站点上的另一个帖子是不够的。在您的情况下,初始化 fxml 加载器并且需要项目结构的部分。但是,如果您搜索错误消息 (Location is required.),应该已经有很多关于此的问题,我很确定已经有一个涵盖您的情况的答案。
  • 您的 fxml 文件似乎未包含在 jar 文件中:Caused by: java.lang.NullPointerException: Location is required.。你确定你正在运行一个罐子吗?在模块系统中,jar 不能拆分为多个文件。
  • 您在src/main/java 下拥有一些 FXML 文件这一事实令人怀疑。当使用 Maven 的 Standard Directory Layout(Gradle 默认也使用该布局)时,资源属于 src/main/resources。我不确定这是如何工作的,即使在 IntelliJ 中也是如此,因为 Maven 应该忽略 src/main/java 下的资源文件。
  • Java 8 和 Java 9+ 关于资源检索的唯一区别在于模块间可见性(即 封装);由于您没有使用模块,更不用说多个模块,因此这种差异不会影响您。换句话说,在 Java 8 中运行的应该在 Java 13 中运行。在复制项目时您必须更改了某些内容。但是,如果没有minimal reproducible example(在问题本身中),帮助您将很难甚至是不可能的。还有,为什么要复制项目而不是更新JDK版本?

标签: java intellij-idea javafx java-8 build


【解决方案1】:

我建议使用 Java 构建自动化工具来构建具有资源和外部库的项目,例如:maven、gradle 或 ant。我更喜欢maven。

你可以使用我来自github的模板Maven项目。

所有构建设置都在项目根目录的 pom.xml 中。您的主要兴趣是插件 maven-shade-plugin,它处理将所有外部依赖项和资源打包到 jar 中。您需要在那里指定您的主要课程。 此外,使用 maven,您无需手动下载库并将库绑定到项目。您只需要在依赖项部分指定库。对于它,只需 google 类似 "library_name maven" 之类的内容,转到 maven 存储库,选择版本并将建议的行复制到依赖项部分。

我还建议将所有图像和 fxml 表单移动到项目资源中。得到它是这样的:

getClass().getResource("/frames/MainFrame.fxml")

将所有代码复制到maven项目中并配置好后,需要:

  1. 在运行和调试按钮附近打开配置下拉菜单。
  2. 编辑配置...
  3. 按左上角的加号按钮。
  4. 选择 Maven。
  5. 在命令行类型全新安装
  6. 您可以通过更改名称来重命名此配置。
  7. 然后保存此配置并运行它,运行成功结束后,您的 .jar 文件将位于 target 目录。

【讨论】:

  • 谢谢。这真的帮助了我。导致问题的原因还在于,Maven 没有包含我的 sqlite-jdbc 全局库。我必须将其添加为依赖项。我使用了<include>**/*.fxml</include> <include>**/*.png</include> <include>**/*.jpg</include> <include>**/*.css</include>,所以我不必更改我的 fxml 和 java 文件中的所有路径。有没有办法在 Maven 中获取 .dmg 或 .app 文件(Mac)和 .exe ?还有一个图标?
  • @ata1704,maven 是一个非常强大的工具,有很多插件。我认为其中一些可以帮助你。尝试 google 查找可以满足您需求的 maven 插件。我不知道这样做的解决方案。
  • @ata1704,是的,meven 不知道您的 IDE 设置,其中包含库。但是当你使用 maven 时,IDE 会自动将它包含在你的项目中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多