线程中的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