我正在将Maven JavaFX应用程序从Java 8迁移到Java11。我已将pom.xml中的插件更新为最新的(兼容Java 11)插件。 编译运行良好,在“目标”文件夹下的正确目录中提供了jar以及所有依赖项和模块,但是当我尝试运行jar文件时,出现了可怕的“缺少JavaFX应用程序类”错误。无论我如何尝试更改插件配置-我总是收到此错误消息,并且该应用程序将无法运行。
现在,更多发现: 1.主类DOES驻留在类和jar中的正确文件夹中。 2. Manifest文件在正确的位置,并且包含main类属性(在Java 8下可以正常工作)。
这是
的相关部分<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source>
<release>11</release>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
<compilerVersion>11</compilerVersion>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>false</addClasspath>
<mainClass>${mainClass}</mainClass>
</manifest>
<manifestEntries>
<JavaFX-Application-Class>${mainClass}</JavaFX-Application-Class>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<includeScope>runtime</includeScope>
<excludeGroupIds>org.openjfx</excludeGroupIds>
</configuration>
</execution>
<execution>
<id>copy-modules</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/mods</outputDirectory>
<includeScope>runtime</includeScope>
<includeGroupIds>org.openjfx</includeGroupIds>
</configuration>
</execution>
</executions>
我通过包含JavaFX模块来运行jar,如文档所述:
java -verbose --module-path ../mods \
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.swing \
-jar jar-file-name.jar \
package.class.MainClass
让我沮丧的是,我尝试了无尽的配置,包括使用JavaFx Java 11示例中的配置。什么都没有。
有什么想法吗?
答案 0 :(得分:1)
我在https://github.com/javafxports/openjdk-jfx/issues/236找到了一种解决方法。
此解决方法包括创建一个新的常规(非Java Fx)类,该类将成为Jar的主要类,并且该类将启动基于JavaFx的原始应用程序类。
这是我找到解决方法的链接中的新类:
public class Main {
public static void main(String[] args) {
HelloFX.main(args);
}
}
希望这对某人有帮助。由于这是一种解决方法而不是真正的解决方案,因此我并未将此答案标记为正确的答案。
编辑:事实证明,此处的JavaFX文档中描述了解决方法:https://openjfx.io/openjfx-docs/#modular
如此处所述,为了创建一个具有所有 必需的JavaFX依赖项,您将需要使用启动器类 并非来自Application。