线程中的JavaFX异常;“主要”;java.lang.NoClassDefFoundError:javafx/application/application

线程中的JavaFX异常;“主要”;java.lang.NoClassDefFoundError:javafx/application/application,java,exception,javafx,noclassdeffounderror,Java,Exception,Javafx,Noclassdeffounderror,我犯了这个错误 Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Ap plication at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.Secu

我犯了这个错误

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Ap
plication
        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
当尝试运行我的类文件时,这是源代码

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.concurrent.Executor;

public class TestApplication extends Application{

    @Override
    public void start(Stage stage) throws Exception {
        new TestApplication();
    }

    public TestApplication() {
        try{
            final Parent root = FXMLLoader.load(Executor.class.getResource("test.fxml"));
            final Stage stage = new Stage(){{
                setScene(new Scene(root, 300, 250));
                setTitle("Test");
                setResizable(false);
                show();
            }};
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

fxml文件包含一个简单的gui。

我正在Linux上开发一个简单的Web应用程序。我遇到了相同的错误,但很容易修复它(假设您像我一样在命令行上开发)


我正在Linux上开发一个简单的Web应用程序,我也遇到了同样的错误,但很容易修复(假设您像我一样在命令行上开发)


在过去的几个小时里,我一直在研究同一个问题。尽管我没有看到它被明确地写出来,但是您似乎必须使用一个JavaFX打包工具,它是Ant任务或javafxpacker可执行文件。(见第5.3.1节)。NetBeans IDE使用Ant打包代码。(我正在使用IntelliJ)

当您使用其中一种打包方法时,除了应用程序的所有代码和资源外,它还将以下内容添加到输出JAR文件中:

/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class
javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1
有了这些,您可以从命令行运行应用程序:

java -jar outjar.jar
一切都很好。如果删除额外的com.javafx.main文件,应用程序将不会运行

为了仔细检查这一点,我查看了JavaFX示例中的所有四个JAR文件(BrickBreaker、emession、FXML LoginDemo和SwingInterop)。它们也都有“额外”文件

对于我的小型测试应用程序,我使用以下命令行构建了一个“可执行”JAR文件:

/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class
javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1

希望这有帮助

在过去的几个小时里,我一直在研究同一个问题。尽管我没有看到它被明确地写出来,但是您似乎必须使用一个JavaFX打包工具,它是Ant任务或javafxpacker可执行文件。(见第5.3.1节)。NetBeans IDE使用Ant打包代码。(我正在使用IntelliJ)

当您使用其中一种打包方法时,除了应用程序的所有代码和资源外,它还将以下内容添加到输出JAR文件中:

/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class
javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1
有了这些,您可以从命令行运行应用程序:

java -jar outjar.jar
一切都很好。如果删除额外的com.javafx.main文件,应用程序将不会运行

为了仔细检查这一点,我查看了JavaFX示例中的所有四个JAR文件(BrickBreaker、emession、FXML LoginDemo和SwingInterop)。它们也都有“额外”文件

对于我的小型测试应用程序,我使用以下命令行构建了一个“可执行”JAR文件:

/com/javafx/main/Main$1.class
/com/javafx/main/Main$2.class
/com/javafx/main/Main.class
/com/javafx/main/NoJavaFXFallback.class
javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1
希望这有帮助

我知道这可能不是启动javafx应用程序的“正确”方式,但我已经为这个问题挣扎了一段时间,并想出了一个解决方案,它不需要使用任何外部打包应用程序,强制您使用ant或maven插件(与shade插件冲突)等等

该解决方案使用Utils4j在运行时动态加载jfxrt。您不能在扩展javafx.application.application的类中加载它,请在单独的类中加载,并将其命名为例如:Launcher

import org.fuin.utils4j.Utils4J

public class Launcher {

    public static void main(String[] args) {
        Utils4J.addToClasspath("file:///"+System.getProperty("java.home")+ File.separator+"lib"+File.separator+"jfxrt.jar");

// CODE TO RUN YOUR CLASS THAT EXTENDS javafx.application.Application goes here.

    }
}
您可以在项目中包含Utils4j(如果使用maven):


org.fuin
utils4j
0.7.0
我知道这可能不是启动javafx应用程序的“正确”方式,但我已经为这个问题挣扎了一段时间,并提出了一个解决方案,它不需要使用任何外部打包应用程序,强制您使用ant或maven插件(与shade插件冲突)等等

该解决方案使用Utils4j在运行时动态加载jfxrt。您不能在扩展javafx.application.application的类中加载它,请在单独的类中加载,并将其命名为例如:Launcher

import org.fuin.utils4j.Utils4J

public class Launcher {

    public static void main(String[] args) {
        Utils4J.addToClasspath("file:///"+System.getProperty("java.home")+ File.separator+"lib"+File.separator+"jfxrt.jar");

// CODE TO RUN YOUR CLASS THAT EXTENDS javafx.application.Application goes here.

    }
}
您可以在项目中包含Utils4j(如果使用maven):


org.fuin
utils4j
0.7.0

我使用maven,我只是在终端中运行这个
mvn安装:安装文件-Dfile=“/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar”-DgroupId=com.oracle.javafx-DartifactId=javafx-Dversion=2.2-dpackage=jar
(在Windows中可能有点不同)。然后maven将安装
jfxrt.jar
,然后您只需将其作为

<dependency>
  <groupId>com.oracle.javafx</groupId>
  <artifactId>javafx</artifactId>
  <version>2.2</version>
</dependency> 

com.oracle.javafx
javafx
2.2

我使用maven,我只是在终端中运行这个
mvn安装:安装文件-Dfile=“/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar”-DgroupId=com.oracle.javafx-DartifactId=javafx-Dversion=2.2-dpackage=jar
(在Windows中可能有点不同)。然后maven将安装
jfxrt.jar
,然后您只需将其作为

<dependency>
  <groupId>com.oracle.javafx</groupId>
  <artifactId>javafx</artifactId>
  <version>2.2</version>
</dependency> 

com.oracle.javafx
javafx
2.2

如果您像我一样使用netbeans,并且安装了两个版本的JDK,那么您应该在配置文件中将类路径更改为相应的java安装。这也是Netbeans中的一个bug: 有两种方法可以做到这一点:
通过执行以下命令以--jdkhome启动NetBeans:

"C:\Program Files\NetBeans Dev 201402160001\bin\netbeans.exe" --jdkhome "C:\Program Files\Java\jdk1.7.0_51"
或者在/etc/netbeans.conf中设置“netbeans\u jdkhome”属性,例如

# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51"
#JDK的默认位置,可以使用--jdkhome:
netbeans\u jdkhome=“C:\Program Files\Java\jdk1.7.0\u 51”

如果您像我一样使用netbeans,并且安装了两个版本的JDK,那么您应该在配置文件中将类路径更改为相应的java安装。这也是Netbeans中的一个bug: 有两种方法可以做到这一点:
通过执行以下命令以--jdkhome启动NetBeans:

"C:\Program Files\NetBeans Dev 201402160001\bin\netbeans.exe" --jdkhome "C:\Program Files\Java\jdk1.7.0_51"
或者在/etc/netbeans.conf中设置“netbeans\u jdkhome”属性,例如

# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51"
#JDK的默认位置,可以使用--jdkhome:
netbeans\u jdkhome=“C:\Program Files\Java\jdk1.7.0\u 51”

IntelliJ和其他IDE可能不会重构您的运行/调试配置。您必须手动更改主类名称之前的包名称。例如,将“sample.Main”更改为“com.company.package.ui.Main”,以便下次尝试运行它时它将正确启动。IDE可能有al
 mvn clean -Dmaven.clean.failOnError=false compile assembly:single -DskipTests=true