JavaFX应用程序在IntelliJ中运行Main时运行良好,内置jar无法运行

时间:2019-08-21 08:40:09

标签: java maven javafx

在过去的几个小时中,我一直在尝试纠正此错误,但没有设法解决。

首先,我创建了一个Maven项目,在其中添加了所需的JavaFX依赖项(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>groupId</groupId>
<artifactId>STTGui</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>


<build>
    <!-- Maven Plugin configuration is required, without it an internal java error is thrown -->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>12</release>
            </configuration>
        </plugin>

        <!-- Maven Shade Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <!-- Run shade goal on package phase -->
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <!-- add Main-Class to manifest file -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>speechToText.userInterface.MainEntry</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.3</version>
            <configuration>
                <mainClass>speechToText.userInterface.MainEntry</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>maven-cognitiveservices-speech</id>
        <name>Microsoft Cognitive Services Speech Maven Repository</name>
        <url>https://csspeechstorage.blob.core.windows.net/maven/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.microsoft.cognitiveservices.speech</groupId>
        <artifactId>client-sdk</artifactId>
        <version>1.6.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>12.0.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-media -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-media</artifactId>
        <version>12.0.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>12.0.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>12.0.2</version>
    </dependency>

</dependencies>
</project>  

我还添加了module-info.java:

module SSTGui {
    requires javafx.controls;
    requires javafx.fxml;
    requires client.sdk;
    opens speechToText.userInterface to javafx.fxml;
    exports speechToText.userInterface;
}

当我在IDE中执行JavaFX应用程序时,一切正常,当我使用maven -> lifecycle ->package构建jar时,jar会生成,但执行时会出现以下错误:

  

错误:缺少JavaFX运行时组件,并且是运行此应用程序所必需的

想法:
1)安装OPENJDK,因为Java JDK 不再包含JavaFX的运行时组件->没有任何变化。
2),使用GLUON的OpenJFX SDK而不是Maven,也没有解决,同样的问题。

我想以某种方式不能将依赖项打包在JAR中,这就是为什么它现在可以工作的原因,但是我无法解决任何想法

编辑,我添加了“ maven shade插件来创建胖子”:

<!-- Maven Shade Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <!-- Run shade goal on package phase -->
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <!-- add Main-Class to manifest file -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>speechToText.userInterface.Main</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>  

但是在构建完成并创建了两个jar之后,original-name.jarname.jar执行name.jar时出现以下错误:

  

线程“ main”中的异常java.lang.SecurityException:清单主要属性的无效签名文件摘要

执行original-name.jar时得到:

  

在原始STTGui-1.0-SNAPSHOT.jar中没有主清单属性

为解决此问题,我尝试实现一个Helper主类,该类不从启动本机主类的Application扩展:

package speechToText.userInterface;

public class MainEntry {

    public static void main(String[] args) {
        Main.main(args);
    }
}  

我还将<mainClass>中的maven-shade-plugin属性更改为此类,并将javafx-plugin中的属性更改为该类。

1 个答案:

答案 0 :(得分:2)

根据评论,此答案收集了解决该问题所需的一些提示。

链接错误

关于分发:理想情况下,您应该使用jlink分发应用程序,创建自定义运行时映像。但是运行mvn javafx:jlink可以得到:

  

错误:自动模块不能与jlink一起使用:client.sdk

即使您的应用程序是模块化的,也不意味着所有依赖项也都是模块化的,因此mvn javafx:jlink可能无法正常工作。但是,使用模块化方法可以执行以下操作:

基于这个问题Is there a way to add maven dependencies while using the maven-jlink-plugin?,您可以尝试从失败的client.sdk自动模块中创建一个模块,但这并不简单。

要探索的另一个选项:使用jpackageearly access),即使它不是模块化的,也可以使您创建项目的安装程序。但是,这需要早期版本的JDK 14 ...

在这一点上,uber / fat jar的经典解决方案似乎是最简单的方法。

JavaFX依赖项错误

但是,在使用mvn package并运行jar之后:

  

错误:缺少JavaFX运行时组件,并且是运行此应用程序所必需的

基本上:

  • 该jar不包含JavaFX依赖项
  • 即使主类是从Application扩展过来的,即使这样做也不会起作用。

此问题Maven Shade JavaFX runtime components are missing已解决。

因此,您需要添加maven-shade-plugin以便捆绑JavaFX依赖项,并且需要添加一个Launcher或不从Application扩展的入口点类。 / p>

清单错误

关于错误:

  

线程“ main”中的异常java.lang.SecurityException:清单主要属性的无效签名文件摘要

另一个问题“Invalid signature file” when attempting to run a .jar 通过添加一个排除清单签名文件的过滤器,为您提供了解决遮阳插件问题的解决方案。

解决所有错误后,您应该可以运行:

mvn package
java -jar target/yourJar.jar