当前位置: 首页 > 知识库问答 >
问题:

缺少Maven Shade JavaFX运行时组件

融伯寅
2023-03-14

pom文件供参考

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Application</groupId>
    <artifactId>Main</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpaceRunner</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>10</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>Application.Main</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>
                                Application.Main
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>Application.Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

共有1个答案

尉迟清野
2023-03-14

这个答案解释了为什么fat/uber jar在JavaFX11上失败。简而言之:

这个错误来自java.base模块中的sun.launcher.launcherHelper。之所以如此,是因为主app扩展应用,有一个主方法。如果是这种情况,则LauncherHelper将检查javafx.graphics模块是否作为命名模块出现。如果该模块不存在,则中止发射。

并且已经为Gradle提出了一个解决方案。

您的application包中将有新类(名称不正确):

// NewMain.java
public class NewMain {

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

和现有的main类,原样:

//Main.java
public class Main extends Application {

    @Override
    public void start(Stage stage) {
        ...
    }

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

现在您需要修改pom并为不同的插件设置主类:

<mainClass>application.NewMain</mainClass>

因此您正在使用:

  • org.openjfx:javafx-controls:11
  • org.openjfx:javafx-controls:11:win
  • org.openjfx:javafx-graphics:11
  • org.openjfx:javafx-graphics:11:win<--这包含Windows的本机DLL
  • org.openjfx:javafx-base:11
  • org.openjfx:javafx-base:11:win

现在,如果您生成fat jar,您将捆绑所有这些依赖项(以及项目中的其他常规第三方依赖项),并且您将能够以以下方式运行项目:

java -jar myFatJar-1.0-SNAPSHOT.jar

有一种解决方案可以生成一个您可以分发的跨平台jar:包括其他平台的其余本机库。

这很容易完成,因为您只需要包含三个平台的图形模块依赖项:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics </artifactId>
        <version>11</version>
        <classifier>win</classifier>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics </artifactId>
        <version>11</version>
        <classifier>linux</classifier>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics </artifactId>
        <version>11</version>
        <classifier>mac</classifier>
    </dependency>
</dependencies>

大小

 类似资料:
  • 我有一个maven项目,我想导出到runnable中。jar文件。 在VSCode中,项目可以正常工作。导出的项目包括。jar文件和包含所有javaFX文件的libs文件夹: 运行以下命令时出现问题: 我不明白为什么会出现这个错误,因为所有JavaFX文件都位于libs文件夹中并且可见。 我目前使用SDKman的Java Temurin 18.0.1。 <代码>Pom。xml文件: 我尝试下载Ja

  • 我第一次尝试使用JavaFX。我在IntelliJ中创建了一个*.fxml文件的项目。然后,我在IntelliJ中打开了内置的fxml gui编辑器。我得到一个警告,我需要为JavaFX添加一个SDK。我转到了项目结构设置、模块、依赖项,并添加了“IntelliJ dir\jre64\lib\ext\jfxrt.jar”。警告消失了。模块作用域设置为编译。如果我试图通过单击IntelliJ中类声明

  • 我在open sdk 11.0.12中使用IntelliJ。我有一个基于maven的项目。我从空项目开始,并添加了一些依赖项。我正在创建JavaFX应用程序。 我的pom。xml文件如下所示: 4.0.0 当我用maven运行它时,效果很好。我已经设定了目标:清理javafx:run。我想在intellij中本地运行此项目,但错误显示: 我试图创建模块文件,但它显示了javafx。应用缺少应用程序

  • 我使用javafx和java-9在eclipse中处理java项目,但我遇到了一个错误: 错误:缺少JavaFX运行时组件,运行此应用程序需要这些组件 我已安装: java-9-openjdk。x86\u 64 java-9-openjdk-devel-9.0.4.11-4。fc27。x86\u 64 openjfx-8.0.152-12。b04。fc27。x86\u 64 openjfx-dev

  • 使用“mvn包”创建jar后,我使用以下命令从jar创建安装程序: 当尝试双击项目可执行文件(.exe由jpackage创建)时,它不会打开。从cmd运行时,我收到以下错误消息: C: \程序文件\项目\u可执行文件\u名称 奇怪的是,如果我双击jar(jpack用来创建程序映像的那个),它会启动我的应用程序。java-jar也是如此。当使用intellij和mvn javafx的“运行”按钮时,

  • 我用编写了以下测试(使用框架时): 然而,当我运行它时,字段似乎丢失了。我得到以下错误: 我想知道为什么,因为我在一节中声明了它。你能帮我吗?