【发布时间】:2020-05-15 09:00:46
【问题描述】:
目前我在启动我的程序时使用 JVM 参数来查找 JavaFX 库,如下所示:
java -javaagent:lib/aspectjweaver-1.9.5.jar -javaagent:lib/spring-instrument-5.2.3.RELEASE.jar --module-path lib/javafx-sdk-13.0.2/lib --add-modules=javafx.controls -jar target/Some_Service-1.0.jar
我的 POM.xml 的插件部分非常简单。除了 Docker 和 Launch4j 插件,我只有这个:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
有没有办法告诉 Maven 将整个 lib 目录(包含 JavaFX 库和 aspectJ/spring 工具 java 代理)捆绑在 jar 中?这样做可以解决我部署应用程序时必须随身携带该 lib 文件夹的问题!谢谢!
******编辑******
我弄乱了 spring boot maven 插件选项,不幸的是我的 jar 仍然不包含我的文件夹:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>lib</folder>
</folders>
<agent>lib/aspectjweaver-1.9.5.jar</agent>
<agent>lib/spring-instrument-5.2.3.RELEASE.jar</agent>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
******编辑 2******
我刚刚发现了一个很棒的库,它通过让您在运行时以编程方式加载它们来完全消除对 -javaagent 参数的需求。看起来我的类路径上的 AspectJ 和 Spring-Instrument 的存在也是它所需要的!看看:https://github.com/subes/invesdwin-instrument.
我现在需要的只是以某种方式将 JavaFX 运行时捆绑到我的 jar 中,而不是使用命令行参数从外部引用它。
【问题讨论】:
-
问题是,这不是项目依赖。这些是 Maven 不知道的外部文件,仅在运行时提供。
-
究竟缺少哪些文件?
-
回答您的第一个问题,这些文件不是由 Maven 作为依赖项提供的,它们是与 openJDK (openJFX) 分开提供的。这些文件过去直接捆绑在 JRE 中,但自 Java 11 起不再存在,因此必须以这种方式引用它们。
-
不需要SDK。 Maven Central 中的工件包含您需要的所有代码(包括特定于平台的本机代码,在运行时提取)。如果您的主类是您的
Application实现并且javafx.graphics模块正在从classpath 使用,那么您遇到的错误也可能发生。如果使用类路径中的所有内容(可能带有胖 jar),那么您的主类 不能 是Application的子类。请参阅this answer(尤其是编辑)和我在之前评论中链接到的答案。
标签: java spring maven javafx libraries