【问题标题】:Exception in init method - JavaFX初始化方法中的异常 - JavaFX
【发布时间】:2016-12-22 00:24:23
【问题描述】:

在使用 Eclipse 导出到 .jar 文件后,我得到了这个异常。 IntelliJ 也这么说。但我的程序在 Eclipse 中运行良好。

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

Caused by: java.lang.ClassNotFoundException: javafx.application.Application
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 13 more

这是怎么回事?

JDK版本:1.7.0_79 开始:java -jar myapp.jar

使用 java -cp jfxrt.jar -jar myapp.jar 尝试后,它给了我以下错误:

java -cp jfxrt.jar -jar memo.jar
Exception in thread "JavaFX Application Thread" Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Layout
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplicationWithArgs$100(LauncherImpl.java:352)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$119(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$117(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$118(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$450(GtkApplication.java:139)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Layout
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 11 more
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.NullPointerException
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:383)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    ... 5 more

【问题讨论】:

  • 看起来是类路径问题。你是如何启动你的应用程序的?
  • @brad 通过控制台命令:java -jar myapp.jar
  • 你使用哪个 JDK 版本来运行它?
  • @James_D jdk1.7.0_79
  • JavaFX 包含在 JDK 1.7 中(大约在更新 6 之后),但不在实际的类路径中。所以你可以做java -cp JAVA_HOME/jre/lib/jfxrt.jar -jar myapp.jar,(用你的JDK的位置替换JAVA_HOME)或者只是升级到(很多)更新的东西。无论如何,JDK 7 早就没有公众支持了。

标签: java eclipse intellij-idea javafx export


【解决方案1】:

Oracle JDK 从 1.8 版开始在类路径中包含 JavaFX;如果您将 JDK 升级到版本 8 或更高版本,它应该可以运行。无论如何,我不建议使用 Java 8 之前的版本构建生产级 JavaFX 应用程序。

如果您确实想使用 Java 7,请考虑使用内置的 JavaFX deployment tools 来构建 jar,而不是 eclipse 中的普通“创建可执行 jar”。如果需要,这些将正确构建一个包含 FX 运行时的 jar 文件。在 Eclipse 中执行此操作的最简单方法是安装 e(fx)clipse(一个 Eclipse 插件);有一个tutorial,其中包含构建 jar 文件的步骤。

【讨论】:

    【解决方案2】:

    javafx.application.Application 类将在 javafx 库中找到;在诸如 Eclipse 之类的 IDE 中,您通常将项目配置为引用编译和执行所需的那些库。当您将代码放入 jar 并在 IDE 外部运行时,您需要以不同的方式将库提供给运行时。

    执行此操作的标准方法是设置一个类路径,该类路径具有对应用程序 jar 和它所需的任何库的引用;执行此操作的 DOS 命令如下所示:

    set classpath=c:\myProjects\myApplication\myJar.jar;c:\java\libaries\javafx\jfxrt.jar
    

    然后 java 就可以访问这两个 jar 文件中的类

    【讨论】:

    • 从 JDK 1.7.0_06 到 JDK 8 之前的 JavaFX 的标准位置位于 jrelib 子目录中。从 JDK 8(对于 Oracle JDK)它被移动到 lib/ext(默认情况下在类路径上)。
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多