【发布时间】:2022-01-22 07:55:45
【问题描述】:
我有一个基于 JavaFX 的桌面应用程序,我通过 GraalVM/GluonFX 创建本机图像。为了在运行时检索应用程序的版本,我之前——当应用程序只有一个胖 JAR 时——使用了Package#getImplementationVersion()。但是,这会返回 null。
我认为这是因为我没有正确设置清单条目?我对gluonfx-maven-plugin的配置:
<plugin>
<groupId>com.gluonhq</groupId>
<artifactId>gluonfx-maven-plugin</artifactId>
<version>1.0.10</version>
<configuration>
<mainClass>${mainClass}</mainClass>
<nativeImageArgs>
<arg>--allow-incomplete-classpath</arg>
<arg>--initialize-at-build-time=org.pdfclown.Version</arg>
<arg>--no-fallback</arg>
</nativeImageArgs>
</configuration>
</plugin>
有没有办法配置插件,使Package#getImplementationVersion() 返回应用程序的版本?我在corresponding documentation 中找不到东西。此外,GraalVM 中的 related issue 已在 2020 年解决。
【问题讨论】:
-
如果你在 JVM (
mvn gluonfx:run) 上运行它可以工作吗?如果不是这样,它与 GluonFX 插件或 GraalVM 无关。它有效,我认为您正在使用清单文件,因此您可能需要将其作为资源包含在内。先运行mvn gluonfx:runagent,然后再次构建原生镜像。如果这不起作用,请发布重现问题的完整方法。 -
@JoséPereda 不,它不适用于
gluonfx:run目标。我也没有清单文件。对于胖 JAR,我使用的是 shade 插件,它有一个ManifestResourceTransformer。它允许设置,例如,实现版本为${project.version}。 GluonFX 插件是否提供类似的功能? -
gluonfx:run与javafx:run相同。在任何情况下,鉴于您要构建原生图像,如果您从源代码构建,则不需要 shade 插件。如果我没看错,您只想将${project.version}传递给您的应用程序,不是吗?为什么不使用 Mavenresources插件并添加一个可以从代码中读取的属性文件? -
@JoséPereda 是的,使用属性文件将是一种替代解决方案,我已经考虑过了。我只是好奇是否有一个“GluonFX 插件”——让
Package#getImplementationVersion()工作的方式? -
在回答这个问题之前,当您构建 fat jar 并运行
java -jar...时,它可以正常工作。但是,如果您通过 JavaFX 插件运行它,则不会,因为您的类路径 (target/classes) 中没有清单,即使您拥有它,也不会被访问。本机图像的 GluonFX 插件也以这种方式工作。如果您为核心代码创建一个 jar,并将其作为依赖项添加到主项目,那么这将起作用。但它会增加额外的复杂性(多模块项目)。在这种情况下,使用资源插件似乎更加简单方便。
标签: java javafx graalvm graalvm-native-image gluonfx