本文介紹了無法運行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方法創建一個新類,并讓它調用Main
Cless,但這不起作用,我得到了以下錯誤:
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 estesources
[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
因為,正如在副本中一樣,您是:
-
使用Maven。
使用JavaFX。
希望創建可執行JAR。
但是,我已經添加了一個答案,列出了您必須在項目中進行更改才能使其正常工作的特定內容。
不推薦使用胖罐子
創建FAT JAR不是當前支持的打包JavaFX應用程序的方法。
openjfx.io project提供了帶有JavaFX的FAT JAR的模板。
pom.xml project file在此。
如果不清楚下面的步驟,請研究有關JavaFX和示例Openjfx.io項目的maven shading的鏈接問題。
將您的項目轉換為可以打包為胖罐子的步驟:
在pom.xml文件中定義您的應用程序所需的所有JavaFX依賴項。
Maven將傳遞地導入,因此您不需要直接依賴于低級別的構件,如JavaFX-base,只需要較高級別的構件,如JavaFX-Controls和JavaFX-fxml(如果您使用它的話)。
它應該是一個非模塊化項目(刪除您的模塊-info.java)
它需要單獨的launcher class(創建一個)
它需要使用maven shade插件合并JAR(使用該插件)
若要使其跨平臺,您需要提供分類依賴項(添加它們)
要支持M1 Mac,您需要
一個額外的分類器依賴項mac-aarch64(添加)
JavaFX 17.0.2+(升級到該版本)。
您需要使用Maven依賴項,而不是JavaFX SDK(您可以刪除SDK)。
maven項目與SDK附帶的JAR不同。
maven項目包括本機代碼,而SDK中的JAR不包括,本機代碼在SDK分發版中的單獨本機庫文件中提供。
通過單獨的下載,您可以獲得包含Java代碼和本機代碼的jmod文件,但這些文件與Maven shade進程不兼容,可以用于jlink進程(就像maven構件一樣)。
使用transformer in the shade plugin指定主類,而不是使用maven-jar-plugin(您應該刪除maven-jar-plugin部分)。
使用mvn package
打包應用程序,不要使用IDE中的內置項目生成器
請勿使用IDEA或Eclipse項目生成系統。
IDE項目生成系統當前不支持正確生成包含JavaFX運行時組件的可執行JAR,它們將生成項目,但如果您嘗試執行它們,它們將顯示錯誤。
mvn package
步驟將生成警告,但它可能仍然有效:
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
要運行,只需使用以下命令,不使用其他命令:
java -jar <yourjar>.jar
這假設用戶已正確:
安裝了兼容的JRE版本。
已將系統路徑配置為包括包含相應java
二進制文件的目錄。
用戶的當前目錄是包含陰影JAR的目錄。
執行步驟將生成警告,但它可能仍會工作:
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @14c24f4c'
不再為任何內容指定指向JavaFX SDK的路徑,不再需要它來支持此開發管道。
不要指定模塊路徑,因為您只是在類路徑(即JAR文件)之外運行應用程序及其依賴項。
只有核心JRE在模塊路徑上,這是隱式的,因為核心JRE類在JRE模塊啟動路徑上。
您正在編譯Java 17到Java 17字節碼(您的maven編譯器插件的源代碼和目標是17)
因此您必須在Java 17+版本上運行它,否則它將不起作用,您將收到字節代碼錯誤。
我可能漏掉了一個步驟,但是,如果我沒有漏掉一個步驟,而您做到了所有這些,那么它將適用于JRE/JavaFX 17.0.2。生成的JAR可以在兼容平臺上使用兼容的預安裝JRE執行。
推薦方法:jlink或jPackage
建議構建jlink
鏡像:
-
使用JavaFX-maven-plugin
mvn javafx:jlink
命令
通過設置JavaFX-maven-plugin的jlinkZipName
參數將其匯編為壓縮包。
確保您擁有完全模塊化的應用程序:
在您的應用程序中定義module-info.java
文件。
確保您的所有依賴項也定義了module-info.java
文件。
若要運行,請解壓縮壓縮包并使用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文件(出現許多錯誤)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,