从终端运行JavaFX时出错-无法找到或加载主类

问题描述

需要一些巧妙的建议来解决此问题-好吧,使用简单的JavaFX应用程序时会出现某种问题。 但是,在全部设置好后(例如模块路径),存在一些问题,但是现在当我无法从终端运行.jar文件时该怎么办?好的,开始讨论使用Javafx不可能实现的任务:

我在Linux Mint 20上安装了Apache NetBeans12。已经安装了JDK,因此'java -version'返回'openjdk版本“ 11.0.7” 2020-04-14'... 启动项目时根本没有问题-JavaFX应用程序可以正常工作。

我需要该应用程序才能在Windows 8.1上运行,但在此之前,我尝试使用java -jar MyFile.jar在Linux终端上运行此.jar文件。 问题开始于此:它说no main manifest attribute,in MyFile.jar。 然后,我决定直接在jar文件(使用Archive Manager打开)中设置主类: 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 在VM选项中添加了: -模块路径“ /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-info看起来像:

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:首先创建启动器类,逐步执行“胖罐子”,然后运行他添加到帖子中的“半胖罐子”命令。有趣的是,这返回了我:Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx-fxml not found。如果我如上所述在Aready中定义了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

好,怎么找不到应用程序? :)

编辑2: 是的,何塞先生拥有权利。在他的“半胖罐子”中,此命令实际上对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项目的解决方案。

解决方法

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

解决方案

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

只需按照以下步骤使用图像运行 jar(maven 和 gradle 项目)

  1. 错误的解决方法:无法找到或加载主类 mypackage。这条线 你在这个位置创建了主类 /src/main/java/YOUR_PACKAGE_NAME/Main.java 所以在创建 jar 文件时,如果你在上面的位置创建主类并且它不添加主类,intellij 不会关心你的主类:在清单文件中主要这一行解决方案是在此位置再创建一个主类(不要删除 Main.Java 类,我们在新的一个主类中使用该类)/src/main/java/EntryPoint.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. 创建EntryPoint.java(New Main Class) Manifest File For Jar File后,点击Cntr+Alt+Shift+S创建Manifest File | Jar 文件,在创建 jar 文件时(在构建 jar 之前)只需选择 EntryPoint.Java 作为下图的主类

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 文件后请仔细阅读此主要步骤的含义 意味着这一行未找到 FXML 文件的解决方案这很棘手,因为所有 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)并将所有文件(复制的文件)粘贴到以前打开的文件夹中(解压 IdeaProjects\YOUR_PROJECT_NAME\out\artifacts\YOUR_PROJECT_NAME_jar\YOUR_PACKAGE_NAME 之类的 jar 文件夹)并在处理完文件后,让 jar 文件选择所有文件(IdeaProjects\YOUR_PROJECT_NAME\out\artifacts\YOUR_PROJECT_NAME_jar),然后单击添加鼠标右键存档(WinRar)并在创建 YOUR_PACKAGE_NAME.jar 文件后,只需双击该文件即可查看魔术

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

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

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

祝你好运

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

,

这是因为我无法添加更多链接,这就是我再次写这篇文章的原因 WinRar 创建 Jar 文件

继续上一个答案和图片 https://i.stack.imgur.com/fY1tw.png

this is what i copy from Resource folder of my project

just paste of all file of resource directory at (in my case) C:\Users\ADMIN\IdeaProjects\SmartSeizeing\out\artifacts\SmartSeizeing_jar\smartSeizeing

WinRar to make Jar follow bellow step (IMAGE)

Step 1

Step 2 select zip option then change extension of your file .zip to .jar

Step 3

This is what i am trying to explain to you and this is my Output

我希望你明白我为创建 jar 文件所做的事情