无法运行JavaFX.jar文件(出现许多错误)

Can not run JAVAFX .jar File (many errors occurred)(无法运行JavaFX.jar文件(出现许多错误))

本文介绍了无法运行JavaFX.jar文件(出现许多错误)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为我的JavaFX程序创建.jar文件时遇到问题。

重要信息:

JavaFX版本:17

Java版本:17

IDE:IntelliJ

Project使用Maven

..................................................................................................................................................................................................................................................

文件结构:

模块文件:

module A_DevicesInfoCardsManager {
    requires javafx.controls;
    requires javafx.fxml;
    requires javafx.graphics;
    requires java.sql;
    
    opens application to javafx.graphics, javafx.fxml, javafx.base, javafx.controls,java.sql;
}

POM文件:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>application</groupId>
    <artifactId>DevicesInfoCards</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>DevicesInfoCards</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.1</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>17.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>17.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>17.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.controlsfx</groupId>
            <artifactId>controlsfx</artifactId>
            <version>11.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.dlsc.formsfx</groupId>
            <artifactId>formsfx-core</artifactId>
            <version>11.3.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>net.synedra</groupId>
            <artifactId>validatorfx</artifactId>
            <version>0.1.13</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-javafx</artifactId>
            <version>12.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.kordamp.bootstrapfx</groupId>
            <artifactId>bootstrapfx-core</artifactId>
            <version>0.4.0</version>
        </dependency>
        <dependency>
            <groupId>eu.hansolo</groupId>
            <artifactId>tilesfx</artifactId>
            <version>11.48</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>application/application.Main
                            </mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

我创建了一个JAR,如下所示:

当我这样运行JAR时:

我收到以下错误:

Error: JavaFX runtime components are missing, and are required to run this application

当我从终端使用命令 java --module-path C:UsersaenasDesktopjavafx-sdk-17.0.1 --add-modules javafx.fxml,javafx.graphics,java.sql -jar DevicesInfoCards.jar

运行它时

我收到以下错误

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.graphics not found

当我尝试以下命令时:

 java --module-path C:UsersaenasDesktopjavafx-sdk-17.0.1 -jar DevicesInfoCards.jar

我收到以下错误

Error: LinkageError occurred while loading main class application.Main
        java.lang.UnsupportedClassVersionError: application/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

我在SO中看了很多教程和答案,但我没有得到任何新的东西。

解决方案之一是将以下内容添加到POM文件中:

<packaging>jar </packaging>


            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>application.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

我无法解决最后一个错误,虽然我确实使用Java 11编译了该程序,但同样的错误也出现了。

我这样做了(将代码添加到POM文件),但我也收到了以下错误:

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

我还尝试使用Main方法创建一个新类,并让它调用MainCless,但这不起作用,我得到了以下错误:

no main manifest attribute, in C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_MavenoutartifactsDevicesHistoryCards_Maven_jarDevicesHistoryCards_Maven.jar

Process finished with exit code 1

尽管我已将POM文件中的所有<mainclass></mainclass>teg更改为正确的新主类,但仍收到相同的错误。

提前感谢您的帮助;

更新

我所做的是删除了模块信息文件,删除了POM文件中的所有JavaFX依赖项,所以我的POM现在看起来是这样的:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>application</groupId>
    <artifactId>DevicesHistoryCards_Maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>DevicesHistoryCards_Maven</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.1</junit.version>
    </properties>

    <dependencies>





        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>



            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>application.MainLauncher</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>
                                application.MainLauncher
                            </mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

当我运行mvn package时,得到以下输出:

PS C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2> mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< application:DevicesHistoryCards_Maven >----------------
[INFO] Building DevicesHistoryCards_Maven 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ DevicesHistoryCards_Maven ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 6 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ DevicesHistoryCards_Maven ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ DevicesHistoryCards_Maven ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2src	est
esources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ DevicesHistoryCards_Maven ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ DevicesHistoryCards_Maven ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ DevicesHistoryCards_Maven ---
[INFO]
[INFO] --- maven-shade-plugin:3.2.4:shade (default) @ DevicesHistoryCards_Maven ---
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2	argetDevicesHistoryCards_Maven-1.0-SNAPSHOT.jar with C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2	argetDevicesHistoryCards_Maven-1.0-SNAPSHOT-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.692 s
[INFO] Finished at: 2022-02-17T13:40:42+03:00
[INFO] ------------------------------------------------------------------------
但是,当我运行java -jar DevicesHistoryCards_Maven2.jar时,我得到了以下信息: Error: Unable to access jarfile DevicesHistoryCards_Maven.jar

为什么我无法访问它?它是在哪里创建的?

推荐答案

此答案为打包和分发您的应用程序提供了两种替代方案,一种(不推荐创建FAT JAR文件),另一种(使用JLINK或JPackage)。

相关问题

我认为这个问题的核心是:

  • Maven Shade JavaFX runtime components are missing

因为,正如在副本中一样,您是:

  1. 使用Maven。
  2. 使用JavaFX。
  3. 希望创建可执行JAR。

但是,我已经添加了一个答案,列出了您必须在项目中进行更改才能使其正常工作的特定内容。

不推荐使用胖罐子

创建FAT JAR不是当前支持的打包JavaFX应用程序的方法。

openjfx.io project提供了带有JavaFX的FAT JAR的模板。

pom.xml project file在此。

如果不清楚下面的步骤,请研究有关JavaFX和示例Openjfx.io项目的maven shading的链接问题。

将您的项目转换为可以打包为胖罐子的步骤:

  1. 在pom.xml文件中定义您的应用程序所需的所有JavaFX依赖项。

    • Maven将传递地导入,因此您不需要直接依赖于低级别的构件,如JavaFX-base,只需要较高级别的构件,如JavaFX-Controls和JavaFX-fxml(如果您使用它的话)。
  2. 它应该是一个非模块化项目(删除您的模块-info.java)

  3. 它需要单独的launcher class(创建一个)

  4. 它需要使用maven shade插件合并JAR(使用该插件)

  5. 若要使其跨平台,您需要提供分类依赖项(添加它们)

  6. 要支持M1 Mac,您需要

    • 一个额外的分类器依赖项mac-aarch64(添加)
    • JavaFX 17.0.2+(升级到该版本)。
  7. 您需要使用Maven依赖项,而不是JavaFX SDK(您可以删除SDK)。

    • maven项目与SDK附带的JAR不同。
    • maven项目包括本机代码,而SDK中的JAR不包括,本机代码在SDK分发版中的单独本机库文件中提供。
    • 通过单独的下载,您可以获得包含Java代码和本机代码的jmod文件,但这些文件与Maven shade进程不兼容,可以用于jlink进程(就像maven构件一样)。
  8. 使用transformer in the shade plugin指定主类,而不是使用maven-jar-plugin(您应该删除maven-jar-plugin部分)。

  9. 使用mvn package打包应用程序,不要使用IDE中的内置项目生成器

    • 请勿使用IDEA或Eclipse项目生成系统。
    • IDE项目生成系统当前不支持正确生成包含JavaFX运行时组件的可执行JAR,它们将生成项目,但如果您尝试执行它们,它们将显示错误。

    mvn package步骤将生成警告,但它可能仍然有效:

     [WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
    
  10. 要运行,只需使用以下命令,不使用其他命令:

    java -jar <yourjar>.jar
    

    这假设用户已正确:

    • 安装了兼容的JRE版本。
    • 已将系统路径配置为包括包含相应java二进制文件的目录。
    • 用户的当前目录是包含阴影JAR的目录。

    执行步骤将生成警告,但它可能仍会工作:

    WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @14c24f4c'
    
  11. 不再为任何内容指定指向JavaFX SDK的路径,不再需要它来支持此开发管道。

  12. 不要指定模块路径,因为您只是在类路径(即JAR文件)之外运行应用程序及其依赖项。

    • 只有核心JRE在模块路径上,这是隐式的,因为核心JRE类在JRE模块启动路径上。
  13. 您正在编译Java 17到Java 17字节码(您的maven编译器插件的源代码和目标是17)

    • 因此您必须在Java 17+版本上运行它,否则它将不起作用,您将收到字节代码错误。

我可能漏掉了一个步骤,但是,如果我没有漏掉一个步骤,而您做到了所有这些,那么它将适用于JRE/JavaFX 17.0.2。生成的JAR可以在兼容平台上使用兼容的预安装JRE执行。

推荐方法:jlink或jPackage

建议构建jlink镜像:

  1. 使用JavaFX-maven-pluginmvn javafx:jlink命令
    • 通过设置JavaFX-maven-plugin的jlinkZipName参数将其汇编为压缩包。
    • 确保您拥有完全模块化的应用程序:
      • 在您的应用程序中定义module-info.java文件。
      • 确保您的所有依赖项也定义了module-info.java文件。
  2. 若要运行,请解压缩压缩包并使用jlink创建的启动脚本。

或者,您可以使用jpackage创建本机安装程序,例如:

  • JPackageScriptFX对于非模块化应用,

  • 用于模块化应用的Akmanjpackage-maven-plugin。

使用jlink或jPackage创建发行版是受支持的配置。对于开发人员来说,创建jlink图像比创建FAT JAR更容易、更可靠。

应用程序的用户可以更轻松、更可靠地使用应用程序,因为除了您的应用程序之外,他们不需要获取和安装兼容的Java运行时。

外部包装资源

有关包装的详细信息,请参阅:

  • Stackoverflow JavaFX tag wiki
  • openjfx.io Runtime image documentation
  • How to create a standalone .exe in Java (that runs without an installer and a JRE)

常见问题

已从POM文件中删除所有JavaFX依赖项

不要这样做,请在pom.xml文件中包含您的应用程序使用的JavaFX依赖项(以及任何必需的第三方依赖项)。

您不需要包括不使用的JavaFX依赖项

您不需要显式列出将传递导入的依赖项,例如JavaFX-base。

其中是命令mvn package创建的.jar文件

当您运行程序包步骤时,这将列在日志文件中:

Replacing C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2	argetDevicesHistoryCards_Maven-1.0-SNAPSHOT.jar with C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2	argetDevicesHistoryCards_Maven-1.0-SNAPSHOT-shaded.jar

它同时创建阴影JAR和未阴影JAR,然后将未阴影JAR替换为阴影JAR。

要查看JAR文件的内容,可以运行:

jar tvf <your-jar-file>.jar

在您的示例中:

cd C:UsersaenasIdeaProjectsdemo2DevicesHistoryCards_Maven2	arget
jar tvf DevicesHistoryCards_Maven-1.0-SNAPSHOT.jar

里面会有很多东西。JAR将包括您的应用程序代码、来自您的依赖库的所有代码、所有JavaFX Java代码以及您在pom.xml中为匹配目标分发平台而定义的分类的JavaFX依赖项的JavaFX本机代码(例如,Windows DLL)。

如果您使用openjfx fat jar sample pom.xml中的阴影定义,它将使用阴影JAR的分类器并将其输出到单独的目录中,因此阴影JAR不会覆盖目标JAR,而是在<project directory>/shade文件夹中创建一个单独的JAR。

如果您不想使用阴影JAR的分类器,则不需要这样做。

有关详细信息,请参阅:

  • attaching the shaded artifact

    默认情况下,插件将用阴影构件替换项目的主构件。如果原始构件和着色构件都应该安装/部署到存储库中,则可以配置插件以将着色构件附加为辅助构件

克隆OpenJFX示例项目以验证您的环境

如果您仍然有问题,请从git克隆openjfx sample project并尝试生成它,以确保在使用已知良好的项目时,您可以在您的环境中正确运行该打包。

这篇关于无法运行JavaFX.jar文件(出现许多错误)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:无法运行JavaFX.jar文件(出现许多错误)

基础教程推荐