34

我收到此错误

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。

4

12 回答 12

15

在过去的几个小时里,我一直在处理同样的问题。尽管我没有看到它明确地写出来,但您似乎必须使用 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 示例(BrickBreaker、Ensemble、FXML-LoginDemo 和 SwingInterop)中的所有四个 JAR 文件。它们也都有“额外”文件。

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

javafxpackager -createjar -appclass sample.Main -outfile outjar -v -nocss2bin -srcdir C:\workspaces\garoup1\out\production\javafx1

希望这可以帮助!

于 2013-08-20T20:07:41.250 回答
6

我有同样的问题,下面的步骤帮助我解决了它,

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

在你的 Eclipse 中配置它(如果你正在使用),或者你可以编译和运行,

编译

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
于 2020-03-29T11:02:34.093 回答
3

我知道这可能不是启动 javafx 应用程序的“正确”方式,但我已经为这个问题苦苦挣扎了一段时间,并想出了一个不需要使用任何外部打包应用程序的解决方法,强制你使用 ant 或 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>
于 2013-09-12T10:46:02.577 回答
3

使用 java 8 应该不会出现这个问题,但对我来说确实如此

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

比较这两个 jar 表明,没有任何与 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>
于 2016-09-28T10:44:37.197 回答
2

我相信我的例子会对某人有所帮助。我没有成功构建真正可执行的 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>
    
  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 文件将出现在目标目录中。它将独立于您运行它的位置执行。

于 2021-01-27T12:07:41.027 回答
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> 
于 2014-02-12T16:52:22.290 回答
1

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

于 2015-03-02T14:09:57.580 回答
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"

或者在 /etc/netbeans.conf 中设置“netbeans_jdkhome”属性,例如

# Default location of JDK, can be overridden by using --jdkhome <dir>:
netbeans_jdkhome="C:\Program Files\Java\jdk1.7.0_51"
于 2014-10-31T11:16:49.080 回答
1

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

然后你可以在设置 VM 选项时引用这个全局变量:

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

对于 Windows,

--module-path "\path to javafx\lib" --add-modules javafx.controls,javafx.fxml

对于 Linux,

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

于 2020-04-04T03:34:52.807 回答
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 $?
于 2013-08-03T17:14:28.183 回答
0

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

Bundle-ClassPath: .,
jfxrt.jar
于 2019-05-28T09:36:28.740 回答
0

我在javafx中找不到Pair类时遇到问题。

似乎 vanilla eclipse(没有e(fx)clipse扩展名)没有搜索 java.xml 中包含的 javaFX 运行时 jar。

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

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

(将 JAVA_HOME 替换为您的 jdk 文件夹)

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

于 2019-05-12T10:55:19.657 回答