在IntelliJ(Java 18,JavaFX 18 Maven项目)中创建可执行JAR,"WARNING: Unsupported JavaFX configuration..."



我有一个Java 18, JavaFX 18 Maven项目,它有很多库,除了JavaFX库,需要包含在工件中。我想创建一个工件,一个包含所有依赖项的jar。我开始按照这个视频创建jar: https://www.youtube.com/watch?v=UKd6zpUnAE4

总结我的步骤,并参考视频中的步骤:

  1. 在IntelliJ项目结构/项目设置/库我删除了所有Maven添加的库,并添加C:Program FilesJava javafx-sdk-18.0.2lib

  2. 之后,在Run/Edit Configurations…我添加了一个VM选项,在那个窗口中我添加了

    ——module-path "C:Program FilesJavajavafx-sdk-18.0.2lib">

    ——添加模块javafx.controls, javafx.fxml

  3. 之后,在视频中,"视频的主机使用main()方法创建一个类,该类运行应用程序的原始main()类。我不需要这个步骤,因为我已经有一个类做了同样的事情。

  4. After, File/Project Structure/Project Settings/Artifact/我添加了一个JAR/From modules with dependencies/我选择了我最近创建的类,并缩短了路径,直到源文件夹(src)

  5. 接下来,我点击添加(+)后,添加了"…javafx-sdk-18.0.2/bin"所有的dll和所有的文件。

在这里,与视频分开,我还创建了一个名为"jar "并将所有Maven依赖的jar文件放在该文件夹中。

根据视频,在这些步骤之后,双击工件,jar运行没有问题。

然而,我需要更多的步骤。我的依赖jar是有签名的jar,所以我需要使用WinRAR打开工件并删除*。科幻,*。DSA和*。RSA文件。早些时候,这给我带来了问题,所以我遵循了这里的想法:在尝试运行jar文件时,Manifest主属性异常的无效签名文件摘要,这里:无效签名文件"当试图运行.jar

时在此之后,一切都应该是好的,然而不是:(罐子不运行在双击。当我从命令行运行它时,我收到以下错误:

$ java -jar jHasher.jar
jan. 15, 2023 3:19:07 DU. com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @3a178016'
javafx.fxml.LoadException:
unknown path:53
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2685)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2532)
at view.GUI.start(GUI.java:29)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:263)
at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:54)
at javafx.fxml.FXMLLoader$Element.applyProperty(FXMLLoader.java:523)
at javafx.fxml.FXMLLoader$Element.processValue(FXMLLoader.java:373)
at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:335)
at javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:245)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:778)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2924)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2639)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at com.sun.javafx.fxml.ModuleHelper.invoke(ModuleHelper.java:102)
at com.sun.javafx.fxml.BeanAdapter.put(BeanAdapter.java:259)
... 19 more
Caused by: java.lang.UnsupportedOperationException: Cannot resolve 'win10-document'
at org.kordamp.ikonli.AbstractIkonResolver.resolve(AbstractIkonResolver.java:61)
at org.kordamp.ikonli.javafx.IkonResolver.resolve(IkonResolver.java:73)
at org.kordamp.ikonli.javafx.FontIcon.setIconLiteral(FontIcon.java:251)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
... 22 more

我搜索了下面的错误信息。我还在StackOverflow上发现了一些帖子,但是它们对我来说并不清楚,我无法解决这个问题。请指导我怎么做。所有的建议都非常感谢。

经过几天的努力,我能够创建可执行的jar。我想与你分享诀窍。

第五步后,跳过WinRAR删除*。科幻,*。DSA和*。RSA文件。我将maven-shade-plugin添加到pom.xml中。shade插件可以自动删除这些不需要的文件,但不幸的是,它本身不能创建一个可运行的JAR,因为再次抛出异常,双击不运行(JavaFX 18 Maven IntelliJ:图形设备初始化失败:d3d, sw初始化QuantumRenderer错误:没有找到合适的管道)。

为了避免这种异常并包含未定位/丢失的JavaFX文件,我们必须重新打包已经打包的JAR。为了做到这一点,我使用了spring-boot-maven-plugin。在设置好插件(下面的代码)之后,您必须以正确的顺序运行maven的插件!我的maven命令如下:mvn clean package spring-boot:repackage

那它,最后创建的JAR (JAR中的JAR)就可以双击运行了。

我的pom.xml对应的部分:

  1. 阴影插件设置:

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
    <execution>
    <phase>package</phase>
    <goals>
    <goal>shade</goal>
    </goals>
    <configuration>
    <transformers>
    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
    <mainClass>controller.Start</mainClass>
    </transformer>
    </transformers>
    <minimizeJar>true</minimizeJar>
    <filters>
    <filter>
    <artifact>*:*</artifact>
    <excludes>
    <exclude>META-INF/*.SF</exclude>
    <exclude>META-INF/*.DSA</exclude>
    <exclude>META-INF/*.RSA</exclude>
    </excludes>
    </filter>
    </filters>
    </configuration>
    </execution>
    </executions>
    </plugin>
    
  2. Spring-boot-maven-plugin设置(这应该放在插件部分的外面,在pom.xml的最后):

    <pluginManagement>
    <plugins>
    <plugin>
    <!-- mvn clean package spring-boot:repackage -->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
    <execution>
    <goals>
    <goal>repackage</goal>
    </goals>
    <configuration>
    <classifier>spring-boot</classifier>
    <mainClass>
    controller.Start
    </mainClass>
    </configuration>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </pluginManagement>
    

确保按正确的顺序运行插件,如上所述!我发现这个资源非常有用:https://www.baeldung.com/spring-boot-repackage-vs-mvn-package

最新更新