首页 > 解决方案 > JavaFX 11 jar 不可执行 java.lang.NoClassDefFoundError: javafx/application/Application

问题描述

几年来,我一直在 JDK 8 上使用 JavaFX。现在我想尝试将我们的 JDK 升级到 OpenJDK 11 和 OpenJFX 11。

在 Apache NetBeans 12.2 上,我尝试了 Maven 示例,它在 NetBeans 上运行良好(右键单击-> 运行)。

但我不能从 jar 文件运行它,甚至不能从 shell 使用 java -jar testJavaFX.jar

我总是得到

Error: Could not find or load main class 
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

我尝试在 RUN config vmOptions 中添加

--module-path %PATH_TO_FX%
--add-modules javafx.controls,primary.fxml

(也尝试了 javafx.fxml 和绝对路径而不是 %PATH_TO_FX%)

当我这样做时,我什至无法在 NetBeans 上运行它

我收到错误

java.lang.module.FindException: Module javafx.controls not found
Command execution failed.

或者

    cd C:\Users\TCN\Documents\NetBeansProjects\testJavaFX; 
"JAVA_HOME=C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.11.9-hotspot" cmd /c "\"
C:\\Program Files\\NetBeans-12.2\\netbeans\\java\\maven\\bin\\mvn.cmd\" 
-Dexec.args=\"--module-path \\\"C:\\Program Files\\Java\\javafx-sdk-11.0.2\\lib\\\" 
--add-modules javafx.controls,javafx.fxml -classpath %classpathtestJavaFX.java 
-classpath %classpath testJavaFX.java 
-classpath %classpath javafx.controls ,primary.fxml 
-classpath %classpath javafx.controls ,javafx.fxml 
-classpath %classpath javafx.controls 
-classpath %classpath javafx.controls testJavaFX.java 
-classpath %classpath com.tradeconnex.testjavafx.App\" 
-Dexec.executable=\"C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.11.9-hotspot\\bin\\java.exe\" 
-Dmaven.ext.class.path=\"C:\\Program Files\\NetBeans-12.2\\netbeans\\java\\maven-nblib\\netbeans-eventspy.jar\" 
-Dfile.encoding=UTF-8 
-Prelease-profile process-classes org.codehaus.mojo:exec-maven-plugin:3.0.0:exec"

The syntax of the command is incorrect.

我在 Mac 和 Windows 机器上都试过这个,结果是一样的。

我猜程序找不到 javafx。

我已将 PATH_TO_FX 设置为 C:\Program Files\Java\javafx-sdk-11.0.2\lib (尝试使用和不使用引号 "" 的 lib 和 bin 并尝试将它们放在 Path 变量中)

我的 JDK 是 jdk-11.0.11.9-hotspot

安装 JDK11 后,我的旧 jdk8 javafx 项目现在也无法运行。

我尝试将所有 javafx jar 从 maven 添加到我的 POM,我再次只能从 NetBeans 运行它。

同样,来自 JDK 8 和 JDK11 的应用程序都在 NetBeans 中运行良好,但都不能从 jar 或 shell 运行。来自 jdk8 的旧 JavaFX jar 曾经是可执行的,现在不是。

请问有人有解决办法吗?

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>testJavaFX</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>testJavaFX</name>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <javafx.version>11</javafx.version>
    <mainClass>com.company.testjavafx.App</mainClass>
</properties>
<dependencies>
    <!--        <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx</artifactId>
        <version>13.0.2</version>
        <type>pom</type>
    </dependency>-->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-media</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-base</artifactId>
        <version>11.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-swing</artifactId>
        <version>11.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-web</artifactId>
        <version>11.0.2</version>
    </dependency>

</dependencies>
<build>
    <finalName>testJavaFX</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <configuration>
                        <excludeScope>system</excludeScope>
                        <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                        <outputDirectory>${project.build.directory}/classes</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.company.testjavafx.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.4</version>
            <configuration>
                <mainClass>com.company.testjavafx.App</mainClass>
            </configuration>
            <executions>
                <execution>
                    <!-- Default configuration for running -->
                    <!-- Usage: mvn clean javafx:run -->
                    <id>default-cli</id>
                </execution>
                <execution>
                    <!-- Configuration for manual attach debugging -->
                    <!-- Usage: mvn clean javafx:run@debug -->
                    <id>debug</id>
                    <configuration>
                        <options>
                            <option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option>
                        </options>
                    </configuration>
                </execution>
                <execution>
                    <!-- Configuration for automatic IDE debugging -->
                    <id>ide-debug</id>
                    <configuration>
                        <options>
                            <option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
                        </options>
                    </configuration>
                </execution>
                <execution>
                    <!-- Configuration for automatic IDE profiling -->
                    <id>ide-profile</id>
                    <configuration>
                        <options>
                            <option>${profiler.jvmargs.arg1}</option>
                            <option>${profiler.jvmargs.arg2}</option>
                            <option>${profiler.jvmargs.arg3}</option>
                            <option>${profiler.jvmargs.arg4}</option>
                            <option>${profiler.jvmargs.arg5}</option>
                        </options>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

标签: javamavenjavafxnetbeans

解决方案


您可以做的是将所有 javafx 模块加载为 maven 依赖项,并使用扩展您的 Main 类并执行 main 函数的 Launcher 类。我已经为此写了一篇完整的媒体文章。一探究竟。

https://nikhiladigaz.medium.com/deploying-non-modular-javafx-applications-using-maven-and-launch4j-fb95b8ab0739

还。您还没有提到您的应用程序是模块化的还是非模块化的。即使您的应用程序是模块化的,这种方法也有效,但您必须在模块信息文件中进行必要的更改。


推荐阅读