线程"main"中的JavaFX异常java.lang.NoClassDefFoundError:javafx/application/Application

Arc*_*hey 25 java javafx exception 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.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
Run Code Online (Sandbox Code Playgroud)

尝试运行我的类文件时,这是源

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ein 13

过去几个小时我一直在研究这个问题.即使我没有看到它明确写出来,看来你必须使用一个JavaFX打包工具,它是Ant任务或javafxpackager可执行文件.(参见http://docs.oracle.com/javafx/2/deployment/packaging.htm,第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
Run Code Online (Sandbox Code Playgroud)

有了这些,您可以从命令行运行应用程序:

java -jar outjar.jar
Run Code Online (Sandbox Code Playgroud)

一切正常.如果我删除额外的com.javafx.main文件,该应用程序不会运行.

为了仔细检查这一点,我查看了JavaFX示例中的所有四个JAR文件(BrickBreaker,Ensemble,FXML-LoginDemo和SwingInterop).它们都有"额外"文件.

对于我的小测试应用程序,我使用此命令行来构建"可执行"JAR文件:

javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


小智 7

我相信我的例子会对某人有所帮助。我没有成功构建真正可执行的 jar 文件,该文件可以通过 Java 8 从任何位置/目录单击运行。迁移到 Java 11 和其他一些小东西就完成了这项工作。

  1. 转到Java 11。指定SDK,IDE中的其他人员,将其添加到pom.xml

     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加 JavaFX 依赖项

     <!--JavaFX-->
     <dependency>
         <groupId>org.openjfx</groupId>
         <artifactId>javafx</artifactId>
         <version>15.0.1</version>
         <type>pom</type>
     </dependency>
     <!--JavaFX-controls-->
     <dependency>
         <groupId>org.openjfx</groupId>
         <artifactId>javafx-controls</artifactId>
         <version>15.0.1</version>
     </dependency>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 构建应用程序

  4. 为主类创建包装类,它扩展了应用程序

     public class Launcher {
         public static void main(String[] args) {
             Main.main(args);
         }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将以下内容添加到 pom.xml

     <build>
     <resources>
         <resource>
             <directory>src/main/resources</directory>
         </resource>
     </resources>
     <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-jar-plugin</artifactId>
             <version>3.2.0</version>
             <configuration>
                 <archive>
                     <manifest>
                         <addClasspath>true</addClasspath>
                         <mainClass>path-to-launcher.Launcher</mainClass>
                     </manifest>
                     <manifestEntries>
                         <Class-Path>.</Class-Path>
                     </manifestEntries>
                 </archive>
             </configuration>
         </plugin>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-assembly-plugin</artifactId>
             <version>3.3.0</version>
             <configuration>
                 <finalName>final-jar-file-name</finalName>
                 <archive>
                     <manifest>
                         <mainClass>path-to-launcher.Launcher</mainClass>
                     </manifest>
                 </archive>
                 <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
                 <appendAssemblyId>false</appendAssemblyId>
             </configuration>
             <executions>
                 <execution>
                     <id>make-assembly</id>
                     <phase>package</phase>
                     <goals>
                         <goal>single</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>
     </plugins>
     </build>
    
    Run Code Online (Sandbox Code Playgroud)
  6. 运行这个maven命令

     mvn clean -Dmaven.clean.failOnError=false compile assembly:single -DskipTests=true
    
    Run Code Online (Sandbox Code Playgroud)

指定名称的 jar 文件将出现在目标目录中。它将独立于您运行它的位置而执行。


Pra*_*een 5

我遇到了同样的问题,以下步骤帮助我解决了它,

在运行应用程序时添加 vm 参数,

--module-path  /home/user/Java-libraries/openjfx-11.0.2_linux-x64_bin-sdk/javafx-sdk-11.0.2/lib/ --add-modules javafx.controls,javafx.fxml
Run Code Online (Sandbox Code Playgroud)

笔记:

  • --module-path 将包含 Java fx 的 jars
  • 我使用了 open-jdk 13

在你的 eclipse 中配置这个(如果你正在使用)或者你可以像这样编译和运行,

编译

javac --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml *.java
Run Code Online (Sandbox Code Playgroud)

java --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml MyMainClass
Run Code Online (Sandbox Code Playgroud)


小智 0

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

cat compile.sh 
 #!/bin/bash

 /usr/lib/jvm/jdk1.7.0_25/bin/javac WebViewSample.java  -cp /usr/lib/jvm/jdk1.7.0_25     
 /jre/lib/jfxrt.jar

 $ cat run.sh 
 #!/bin/sh
 JAVA_HOME=/usr/lib/jvm/jdk1.7.0_25/bin/
 CLASSPATH=/usr/lib/jvm/jre1.7.0_25/lib/jfxrt.jar:. 

 $JAVA_HOME/java -cp $CLASSPATH WebViewSample $* 2>&1 /dev/null | awk -F\| '{ print  $2"|"$3  ; exit $1 }'

 exit $?
Run Code Online (Sandbox Code Playgroud)