无法运行具有JavaFX捆绑依赖项的.jar可执行文件

时间:2019-09-19 18:33:23

标签: java maven javafx

我有一个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”。

但是,此解决方案是一种解决方法,这真的是唯一的选择吗?

0 个答案:

没有答案