gpt4 book ai didi

在 IntelliJ 中运行 Main 时,JavaFX 应用程序运行正常,构建的 jar 无法运行

转载 作者:行者123 更新时间:2023-11-30 01:47:00 25 4
gpt4 key购买 nike

过去几个小时我一直在尝试修复此错误,但未能成功。

首先,我创建了一个 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;
}

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

Error: JavaFX runtime components are missing, and are required to run this application

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

我猜想不知何故,依赖项没有打包在 JAR 中,这就是它现在可能可以工作的原因,但我无法解决它,有什么想法吗

编辑我添加了`maven shade插件来创建一个 fat jar 子:

<!-- 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时我收到以下错误:

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

执行original-name.jar时我得到:

no main manifest attribute, in original-STTGui-1.0-SNAPSHOT.jar

为了解决这个问题,我尝试实现一个 Helper 主类,它不从 Application 扩展。这启动了我的 native main:

package speechToText.userInterface;

public class MainEntry {

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

我还更改了<mainClass>我的 maven-shade-plugin 中的属性到这个类以及javafx-plugin中的属性。

最佳答案

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

Jlink错误

关于分发:理想情况下,您应该使用jlink来分发您的应用程序,创建自定义运行时镜像。但是运行 mvn javafx:jlink 给出:

Error: automatic module cannot be used with 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之后:

Error: JavaFX runtime components are missing, and are required to run this application

基本上:

  • 该 jar 不包含 JavaFX 依赖项
  • 即使这样做了,如果主类从 Application 扩展,它也不会起作用。

这个问题已经解决了Maven Shade JavaFX runtime components are missing .

因此,您需要添加 maven-shade-plugin 来捆绑 JavaFX 依赖项,并且需要添加一个 Launcher 或入口点类t 从 Application 扩展。

明显错误

关于错误:

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

这个其他问题“Invalid signature file” when attempting to run a .jar通过添加排除 list 签名文件的过滤器,为您提供解决阴影插件问题的解决方案。

解决所有错误后,您应该能够运行:

mvn package
java -jar target/yourJar.jar

关于在 IntelliJ 中运行 Main 时,JavaFX 应用程序运行正常,构建的 jar 无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57587642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com