在过去的几个小时中,我一直在尝试纠正此错误,但没有设法解决。
首先,我创建了一个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.jar
和name.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中的属性更改为该类。
答案 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
自动模块中创建一个模块,但这并不简单。
要探索的另一个选项:使用jpackage
(early access),即使它不是模块化的,也可以使您创建项目的安装程序。但是,这需要早期版本的JDK 14 ...
在这一点上,uber / fat jar的经典解决方案似乎是最简单的方法。
JavaFX依赖项错误
但是,在使用mvn package
并运行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