当前位置: 首页 > 知识库问答 >
问题:

用maven构建的JavaFX jar不能执行('NoClassDefFoundError')

习华灿
2023-03-14

我正在尝试分发一个跨平台的JavaFX应用程序(jar格式),因此用户不需要访问自己的JavaFX库就可以运行该应用程序。显然,最好的选择是使用Maven。

由于这是我第一次使用Maven,而且我不太熟悉它是如何工作的,所以尽管我遵循了各种教程,但我还是遇到了一些问题。

下面是我的pom。用于我的项目的xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>MM</groupId>
    <artifactId>TP_2</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>15</maven.compiler.source>
        <maven.compiler.target>15</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
            <classifier>win</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
            <classifier>mac</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
            <classifier>linux</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
            <classifier>win</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
            <classifier>linux</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
            <classifier>mac</classifier>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>15</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <configuration>
                    <mainClass>mvc.Launcher</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestFile>src/main/java/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

当我建立这个项目时,一切似乎都很好。未报告任何错误,jar已成功创建。然而,当我尝试执行jar时(使用java-jar命令),我得到了以下异常

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:855)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:753)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:676)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:634)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
    at mvc.Launcher.main(Launcher.java:5)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
    ... 10 more

我真的不确定我和Maven的问题在哪里?我尝试过清理和重建,但仍然不起作用。

作为参考,我主要遵循了这个线程的解决方案:https://stackoverflow.com/a/53536555/7036218

共有1个答案

终睿
2023-03-14

你和Maven没有问题。你的问题是你想做什么。将JavaFX应用程序作为fat jar分发只是不太受支持。请看一看JPackage。它与任何最新的JDK一起提供。然后可能会遵循本教程:https://github.com/dlemmermann/JPackageScriptFX

 类似资料:
  • 问题内容: 我试图使用maven为名为“ logmanager”的小型家庭项目生成可执行jar,如下所示: 如何使用Maven创建具有依赖项的可执行JAR? 我将此处显示的代码段添加到pom.xml中,并运行了mvn assembly:assembly。它在logmanager / target中生成两个jar文件:logmanager-0.1.0.jar和logmanager-0.1.0-jar

  • 我是JavaFX的新手。我用maven创建了JavaFX项目,并添加了所有依赖项。idea中的Project工作得很好,但当我在maven中构建它并尝试在目标文件夹中打开时,jar没有反应,它会给出以下错误。 (未知源)在com.sun.javafx.application.launcherImpl$$lambda$51/881058039。运行(Unkn自己的源)在com.sun.javafx.

  • 我制作了一个Java应用程序,它使用Maven、JavaFX和一些其他依赖项。以前,构建一个可执行jar很容易,但由于Java11是模块化的,不包含JavaFX,所以我无法构建一个工作的jar。 我已经尝试了很多事情,但我不知道我现在应该做什么。 我的pom。xml 我试图构建包含所有依赖项的工件,但在运行(java-jar)时出现了一个错误: 编辑 我曾尝试使用Jlink构建一个包含JavaFX

  • 我开始学习几个发行版的打包(目前是Cygwin和Debian)。 他们需要构建系统以允许树外构建(同义词源代码外构建): http://wiki.debian.org/UpstreamGuide#Out-of-Tree_构建 要解决“哑”构建系统(例如cygport),建议使用lndir(来自xutils项目): 我阅读了mvn(1)手册页,但没有发现任何合适的内容。接下来,我只是尝试: 正如您所

  • 问题内容: 我开始学习一些发行版(目前为Cygwin和Debian)的包装。 他们要求构建系统以允许 树外构建 (同义词 out-of-source build ): http://wiki.debian.org/UpstreamGuide#Out-of- Tree_Builds 要解决“哑”构建系统(例如 cygport), 建议使用 lndir (来自 xutils 项目): 我阅读了 mvn

  • 在src/main/groovy/foo/test2.java中: 分级文件: 我造了一个罐子: 我在这里有版本控制中的测试用例: https://github.com/wu-lee/test-groovy-main