我有一个maven测试项目,用于构建一个非常简单的javaFX应用程序。我已经设置了maven,它创建(安装任务)一个.jar文件,包括该项目的所有依赖项。由于javaFX不是标准JRE / JDK的一部分,因此认为这是一个好主意。
通过双击具有相关性的jar,我已经能够在Windows10 PC上成功启动该应用程序。由于JRE中缺少javaFX,因此在没有依赖项的情况下进行构建会导致错误。到目前为止一切顺利。
但是,现在坐在我的Manjaro Linux PC上,我无法启动该应用程序。
该项目的代码是100%相同的(只是克隆了仓库)。双击.jar无效,尝试从带有“ java -jar APP”的终端执行它也不会,从而导致错误“缺少已使用的javaFX组件”。我在这里缺少什么,依赖项应该捆绑到.jar中,而且它在Windows下也可以运行? 顺便说一句,我在Linux上使用JDK 12.0.2。
这是我的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>iffuw</groupId>
<artifactId>javaFX-test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- build a jar with all dependencies -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-base -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>13</version>
</dependency>
</dependencies>
</project>
此外,我的默认Java版本具有javaFX库:
ls -l /usr/lib/jvm/java-12-openjdk/lib | grep javafx
-rw-r--r-- 1 root root 744481 17. Aug 18:39 javafx.base.jar
-rw-r--r-- 1 root root 2508117 17. Aug 18:39 javafx.controls.jar
-rw-r--r-- 1 root root 125617 17. Aug 18:39 javafx.fxml.jar
-rw-r--r-- 1 root root 4349165 17. Aug 18:39 javafx.graphics.jar
-rw-r--r-- 1 root root 263870 17. Aug 18:39 javafx.media.jar
-rw-r--r-- 1 root root 113 17. Aug 18:39 javafx.properties
-rw-r--r-- 1 root root 87714 17. Aug 18:39 javafx.swing.jar
-rw-r--r-- 1 root root 36678 17. Aug 18:39 javafx-swt.jar
-rw-r--r-- 1 root root 702059 17. Aug 18:39 javafx.web.jar
-rwxr-xr-x 1 root root 26288 17. Aug 18:39 libjavafx_font_freetype.so
-rwxr-xr-x 1 root root 18024 17. Aug 18:39 libjavafx_font_pango.so
-rwxr-xr-x 1 root root 18024 17. Aug 18:39 libjavafx_font.so
-rwxr-xr-x 1 root root 239280 17. Aug 18:39 libjavafx_iio.so
我在这里想念什么?
编辑
对不起,我根本不明白。带有上述pom.xml的项目可在Windows10 PC上完美运行! 在我的Manjaro Linux中构建它并使用“ java -jar APPLICATION”总是会抛出“缺少必需的JavaFX类”之类的错误。 为什么它在Windows而不是Linux上执行?
是否有使用maven构建JavaFX应用程序的最佳实践,该应用程序肯定可以在安装了基本JRE的所有系统上运行?
EDIT_2
我刚刚发现,在Windows10下,我只需双击即可启动该应用程序。从cmd“ java -jar APPLICATION”产生与Linux下相同的错误 “错误:缺少JavaFX运行时组件,并且是运行此应用程序所必需的”。 但是,在cmd中省略了“ java -jar”,该程序将启动。 尝试在Linux上通过“ ./APPLICATION.jar”省略java -jar来启动它时,出现错误“无法执行二进制文件:文件格式错误”。
EDIT_3
因此,我设法修改了该应用程序,以便可以通过“ java -jar APPLICATION.jar”来运行该应用程序(在Linux和Windows上构建之后)。 具有所有依赖项的单个jar的构建工作正常。 来自其中一个评论问题的建议达成了交易。 我必须“清理” Main.java,以便它不会从JavaFX扩展应用程序。解决方案就是简单地创建一个不扩展任何内容并仅调用Main.main(args)的“ NewMain”。
但是,此解决方案是一种解决方法,这真的是唯一的选择吗?