【问题标题】:Error while running JavaFX from terminal - Could not find or load main class从终端运行 JavaFX 时出错 - 找不到或加载主类
【发布时间】:2021-02-11 01:33:30
【问题描述】:

需要一些聪明的建议来解决这个问题 - 好吧,在使用简单的 JavaFX 应用程序时遇到了某种问题。 但是,在所有设置(例如模块路径)时出现了一些问题,但是当我无法从终端运行 .jar 文件时怎么办?好的,开始谈论不可能的任务:用javafx:

我在 Linux Mint 20 上安装了 Apache NetBeans 12。JDK 已经安装,所以 'java -version' 返回 'openjdk version "11.0.7" 2020-04-14'... 启动项目时完全没有问题 - JavaFX 应用程序工作正常。

我需要这个应用程序在 Windows 8.1 上运行,但在此之前我尝试使用 java -jar MyFile.jar 在我的 linux 终端上运行这个 .jar 文件。 问题从这里开始:它说no main manifest attribute, in MyFile.jar。 然后我决定直接在 jar 文件中设置主类(使用存档管理器打开): MyFile.jar -> META-INF -> MANIFEST.MF 并在最后一行添加:Main-Class: mypackage.MyClass

现在我有:Error: Could not find or load main class mypackage.MyClass Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

好的,如何以及为什么?

只是说在NetBeans中我还设置了主类: 项目 -> 属性 -> 运行 -> 主类:mypackage.MyClass 在虚拟机选项中我添加了: --module-path "/locationToJavaFX/javafx-sdk-11.0.2/lib" --add-modules javafx.controls,javafx.fxml

在 pom 文件中,还设置了主类(由 IDE 生成):

//  other lines
<groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <mainClass>mypackage.MyClass</mainClass>
                </configuration>
//  other lines

模块信息看起来像:

module mypackage {
    requires javafx.controls;
    requires javafx.fxml;
    requires org.jsoup;
    
    opens mypackage to javafx.fxml;
    exports mypackage;      // some people advice without this line, I tried but same problem
}

只是想清楚一点-我可能尝试了 stackoverflow 上可用的所有内容(我不算数)。我昨天和今天(几乎整整 2 天)尝试解决这个问题,但我不能。

只是一个想法:Java 编程并不像配置那么难。 干杯并感谢您的帮助!

编辑: 只是说我尝试了 José suggested :首先创建启动器类,按照“fat jar”一步一步操作,然后运行他添加到帖子中的“semi-fat jar”命令。有趣的是,这返回了我:Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx-fxml not found。如果我已经按照上述问题定义了 javafx-fxml,为什么找不到 javafx-fxml?另外,为什么 Netbeans 没有在清单(在 jar 中)文件中为我提供主类?当我在清单中添加主类时,我得到了这个:

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at Main.main(Main.java:5) Caused by: java.lang.ClassNotFoundException: javafx.application.Application
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 10 more

好的,怎么找不到Application? :)

编辑 2: 是的,何塞先生有权利。他的'semi-fat jar'帖子中的这个命令实际上适用但不适用于Maven(我在同一个Ant项目中使用它并且它有效)。 Maven 不知何故无法识别 JSoup 类(即使我添加了依赖项)并且 java 返回:

Exception in Application start method Exception in thread "main" 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:834) Caused by: java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at p.eis.GetData1.startIt(GetData1.java:34)
at p.eis.GetData1.<init>(GetData1.java:28)
at p.eis.SampleController.initialize(SampleController.java:37)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at p.eis.Start.loadFXML(Start.java:32)
at p.eis.Start.start(Start.java:19)
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(Native Method)
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)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
... 1 more Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 17 more

希望我能在不久的将来为 Maven 项目找到解决方案。

【问题讨论】:

  • 您需要在终端的命令中包含--module-path 选项
  • @James_D 不,同样的Error Could not find or load main class mypackage.MyClass Caused by: java.lang.NoClassDefFoundError: javafx/application/Application 即使我在 .jar 文件中设置了主类(如所述)。不知何故,如果我“清理并构建”项目,那行代码将被删除。这真是令人沮丧——为什么他们不构建比这更简单的“Java-running”。是的,这就是 2020 年的现实……
  • 在 Java 11 及更高版本中,JavaFX 不是 JDK 的一部分;它是一个单独的模块。这里的重点是大多数 Java 应用程序不需要 JavaFX,因此它允许占用更轻的资源(例如,用于微服务等)。因此,要运行 JavaFX 应用程序,您需要将 JavaFX 模块添加到运行时。首选方法是创建一个添加了这些模块的 Java 运行时,然后将您的应用程序与该 Java 运行时捆绑在一起。请参阅jpackage,它包含在 JDK 14 及更高版本中(但可用于 Java 11 运行时)。
  • 我将再次编辑帖子,我上次输入有误。但不知何故,使用 jar 命令运行 Maven 项目对我来说是不可能的(目前)。无论如何,谢谢詹姆斯。

标签: javafx attributes manifest executable-jar noclassdeffounderror


【解决方案1】:

是的,我注意到你使用 maven,但这不是 maven 的错,我知道为什么会发生这种情况,我有解决方案,所以在我的解决方案中有魔法并且工作正常,因为我使用我的解决方案制作 jar,你知道我的 jar文件在没有终端的情况下运行(意味着双击 jar 文件)

解决方案

你需要 winRar 因为我用它来获取信息阅读我的解决方案!

只需按照以下步骤操作图片即可运行 jar(maven 和 gradle 项目)

  1. 错误的解决方案:无法找到或加载主类 mypackage。这条线 您在此位置 /src/main/java/YOUR_PACKAGE_NAME/Main.java 创建了主类,因此在创建 jar 文件时,如果您在上述位置创建主类并且它不添加主类,intellij 不会关心您的主类: Main this line in Manifest File 解决方案是在这个位置/src/main/java/EntryPoint.java再创建一个主类(不要删除Main.Java类我们在新的一个主类中使用这个类)见下面的图片和代码我做了什么

EntryPoint.java is new main class (IMAGE)

public class EntryPoint {
 public static void main(String[] args) {
    smartSeizeing.Main.main(args);
 }

}

Main.java 图像

Main.Java (IMAGE)

  1. 为Jar File创建EntryPoint.java(New Main Class) Manifest File后,点击Cntr+Alt+Shift+S创建Manifest File | Jar 文件,在创建 jar 文件期间(构建 jar 之前)只需选择 EntryPoint.Java 作为 Image 下面的 Main Class

Main Class : EntryPoint (IMAGE)

在单击确定按钮之前更改清单文件的位置,在此位置创建它 /src/META_INF/manifest.mf(错误位置:/src/main/META_INF/menifest.mf)并单击应用按钮保存变化

Location Of Manifest File like below image

Just Manifest.MF File (IMAGE)

  1. 构建 Jar 文件转到 Option[Build->Build-Artifacts...] 并花费 3-5 分钟来创建 jar。

  2. 创建Jar文件后请仔细阅读此主要步骤的意思 意味着 解决这行 NOT FOUND FXML FILE 这很棘手,因为所有 fxml 文件都存储在资源目录中,因此在创建 jar 时,intellij 不会再次从资源目录添加任何文件,在创建 jar 时不包括 fxml 文件

如何添加 FXML 文件的解决方案现在我们必须使用 WIN_RAR 软件来添加此文件,相信我它的工作,不会影响任何文件和工作文件只需按照以下步骤添加 FXML 文件

添加 FXML 文件步骤

  1. 关闭 Intellij
  2. 在我的情况下,转到您的项目目录 C:\Users\ADMIN\IdeaProjects\YOUR_PROJECT_NAME 并转到 YOUR_PROJECT_NAME\out\artifacts\YOUR_PROJECT_NAME\YOUR_PROJECT_NAME.Jar 以便您找到项目的 jar 文件

鼠标右键选择选项,选择 EXTRACT HERE(WinRar Option) 选项

JUST I AM ExtractING MY JAR (IMAGE)

DELETE ONLY JAR FILE AFTER EXTRACTING Like my file name smartSeizeing.jar i delete it (IMAGE)

  1. 提取和删除 jar(仅 jar 文件)文件后 在我的情况下打开 YOUR_PACKAGE_NAME 文件 C:\Users\ADMIN\IdeaProjects\SmartSeizeing\out\artifacts\SmartSeizeing_jar\smartSeizeing 保持打开它并打开你的项目目录并从资源目录复制所有文件(包括所有文件,如 fxml、css、html、hibernet 文件,如果你有其他文件到 fxml)并将所有文件(复制的文件)粘贴到之前打开的文件夹中(解压缩 jar 文件夹,如 IdeaProjects\YOUR_PROJECT_NAME\out\artifacts\YOUR_PROJECT_NAME_jar\YOUR_PACKAGE_NAME)并在复制文件后,只需制作 jar 文件选择所有文件(IdeaProjects\YOUR_PROJECT_NAME\out\artifacts\YOUR_PROJECT_NAME_jar)并单击鼠标右键,选择添加存档(WinRar)并创建 YOUR_PACKAGE_NAME.jar 文件后,只需双击该文件并查看魔法

如何添加 fxml 以及如何再次创建我在下图中提到的 jar(没有任何 curreption),以便您可以轻松理解我所做的以及我的输出图像

i pasted all file of resource directory of my project (IMAGE)

请参阅下面的答案,因为我无法为如何使用 winRar 制作 jar 的步骤添加更多链接,并且该 jar 工作正常以及我的输出

祝你好运

你想要视频就告诉我我制作关于它的视频如何制作可运行的 jar 没有任何异常或错误!

【讨论】:

  • 我想要视频。 ?
  • 我会尽快制作视频!
【解决方案2】:
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2014-08-02
相关资源
最近更新 更多