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

时间:2013-06-01 02:17:59

标签: 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.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。

12 个答案:

答案 0 :(得分: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

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

java -jar outjar.jar

一切正常。如果我删除额外的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

希望这有帮助!

答案 1 :(得分:3)

使用java 8不应该提出这个问题,但它确实为我做了

我最初是从Eclipse Export创建我的jar - > Runnable Jar,很好。当我搬到Maven时,它失败了。

比较两个罐子显示没有fx相关的东西与jar一起打包(正如我所期待的那样)但Eclipse生成的清单中有Class-Path: .。让maven用以下方法打包jar(适用于Java 8)

 <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.pg.fxapplication.Main</mainClass>
            </manifest>
              <manifestEntries>
                    <Class-Path>.</Class-Path>
                </manifestEntries>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>

答案 2 :(得分:2)

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

在运行应用程序时添加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

注意:

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

在日食中进行配置(如果使用的话),也可以像这样编译并运行

编译

javac --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml *.java

运行

java --module-path /path/to/java-fx-libs/ --add-modules javafx.controls,javafx.fxml MyMainClass

答案 3 :(得分:2)

我相信我的例子会对某人有所帮助。我没有成功构建真正可执行的 jar 文件,该文件可以通过使用 Java 8 从任何地方/目录单击运行。迁移到 Java 11 和其他一些 twicks 完成了这项业务。

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

     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
    
  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>
    
  3. 构建应用程序

  4. 为您的 Main 类创建包装类,它扩展了 Application

     public class Launcher {
         public static void main(String[] args) {
             Main.main(args);
         }
     }
    
  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>
    
  6. 运行这个 maven 命令

     mvn clean -Dmaven.clean.failOnError=false compile assembly:single -DskipTests=true
    

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

答案 4 :(得分:1)

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

该解决方案使用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):

    <dependency>
        <groupId>org.fuin</groupId>
        <artifactId>utils4j</artifactId>
        <version>0.7.0</version>
    </dependency>

答案 5 :(得分:1)

我使用maven,我只是在终端中运行mvn install:install-file -Dfile="/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/jfxrt.jar" -DgroupId=com.oracle.javafx -DartifactId=javafx -Dversion=2.2 -Dpackaging=jar(在Windows中可能有点不同。)。然后maven将安装jfxrt.jar,然后您可以简单地将其引用为

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

答案 6 :(得分:1)

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

"C:\Program Files\NetBeans Dev 201402160001\bin\netbeans.exe" --jdkhome "C:\Program Files\Java\jdk1.7.0_51"

或者设置&#34; netbeans_jdkhome&#34; /etc/netbeans.conf中的属性,例如

# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51"

答案 7 :(得分:1)

IntelliJ和其他IDE可能不会重构您的运行/调试配置。您必须手动更改Main类名称前面的包名称。例如,将'sample.Main'更改为'com.company.package.ui.Main',以便下次尝试运行时它将正确启动。 IDE可能已经使用红叉标记了“运行/调试”按钮,因为它无法找到主类。当您打开运行/调试配置时,它也会发出警告。

答案 8 :(得分:1)

我已经在“ Ask ubntu”上回答了。 我建议您使用https://openjfx.io/openjfx-docs/。我正在使用Eclipse IDE,但它适用于所有IDE

然后,当将VM选项设置为:

时,可以引用此全局变量。

在IDE中,右键单击项目->运行方式->运行配置->参数-> VM参数

对于Windows,

-module-path“ \ javafx \ lib的路径” --add-modules javafx.controls,javafx.fxml

对于Linux,

-modulefpath / javafx / lib的路径--add-modules javafx.controls,javafx.fxml

答案 9 :(得分: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 $?

答案 10 :(得分:0)

我无法从javafx中找到 Pair 类。

似乎纯日食(没有 e(fx)clipse 扩展名)不会搜索java随附的javaFX运行时jar。

我刚刚将此外部jar添加到我的eclipse项目构建路径中(或者,如果您处于调试配置中,则在调试配置的JRE选项卡中添加外部jar):

$ JAVA_HOME / jre / lib / ext / jfxrt.jar

(用您的jdk文件夹替换JAVA_HOME)

对我来说,它位于/installs/jdk1.8.0_211/jre/lib/ext/jfxrt.jar

答案 11 :(得分:0)

在日食环境中:将jfxrt.jar添加到MANIFEST.MF文件中的Bundle-ClassPath中。

Bundle-ClassPath: .,
jfxrt.jar