【发布时间】: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