我有一个Java 18, JavaFX 18 Maven项目,它有很多库,除了JavaFX库,需要包含在工件中。我想创建一个工件,一个包含所有依赖项的jar。我开始按照这个视频创建jar: https://www.youtube.com/watch?v=UKd6zpUnAE4
总结我的步骤,并参考视频中的步骤:
-
在IntelliJ项目结构/项目设置/库我删除了所有Maven添加的库,并添加C:Program FilesJava javafx-sdk-18.0.2lib
-
之后,在Run/Edit Configurations…我添加了一个VM选项,在那个窗口中我添加了
——module-path "C:Program FilesJavajavafx-sdk-18.0.2lib">
——添加模块javafx.controls, javafx.fxml
-
之后,在视频中,"视频的主机使用main()方法创建一个类,该类运行应用程序的原始main()类。我不需要这个步骤,因为我已经有一个类做了同样的事情。
-
After, File/Project Structure/Project Settings/Artifact/我添加了一个JAR/From modules with dependencies/我选择了我最近创建的类,并缩短了路径,直到源文件夹(src)
-
接下来,我点击添加(+)后,添加了"…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对应的部分:
-
阴影插件设置:
<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>
-
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