【发布时间】:2019-08-21 08:40:09
【问题描述】:
过去几个小时我一直在尝试修复此错误,但没有成功。
首先,我创建了一个 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 中的异常:Manifest 主要属性的签名文件摘要无效
当执行original-name.jar 我得到:
没有主清单属性,在 original-STTGui-1.0-SNAPSHOT.jar 中
为了解决这个问题,我尝试实现一个 Helper 主类,它不从启动我的原生 main 的 Application 扩展:
package speechToText.userInterface;
public class MainEntry {
public static void main(String[] args) {
Main.main(args);
}
}
我还将maven-shade-plugin 中的<mainClass> 属性更改为此类以及javafx-plugin 中的属性。
【问题讨论】:
-
你是对的,jar 不包含 JavaFX 依赖项。您可以为此使用阴影插件(请参阅this question),甚至更好,因为您有一个模块化应用程序,您可以运行
mvn javafx:jlink来创建自定义图像(请参阅doc)。 -
@JoséPereda using
mvn javafx:jlink抛出:错误:自动模块不能与 jlink 一起使用:client.sdk(我的认知语音服务)+ 无法执行目标 org.openjfx:javafx-maven-plugin: 0.0.3:jlink -
那你就不能直接使用jlink了。有更复杂的选项可以从非模块化依赖项中创建模块,但现在我想你可以只做一个胖 jar。
-
@JoséPereda 我尝试了阴影插件,并更新了我的问题。首先生成了两个 JAR,虽然我不知道为什么一个被命名为 STT...jar 和另一个 original-STT...jar 并且在执行 STT..jar 之后我得到
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes -
对于初学者,您需要使用 Launcher 类(请参阅我之前链接的问题)。不能说什么是 SST,你应该得到一个“胖” jar(以 MB 为单位),你可以用
java -jar yourFatJar.jar运行它。您是否有机会使用 AdoptOpenJDK?