首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Package#getImplementationVersion()使用本机映像返回null (GraalVM/GluonFX)

Package#getImplementationVersion()使用本机映像返回null (GraalVM/GluonFX)
EN

Stack Overflow用户
提问于 2021-12-20 18:10:27
回答 1查看 452关注 0票数 2

我有一个基于JavaFX的桌面应用程序,我通过GraalVM/GluonFX为其创建本地图像。为了在运行时检索应用程序的版本,我以前--当应用程序只有一个胖罐子时--使用了Package#getImplementationVersion()。但是,这将返回null

我想这是因为我没有正确地设置清单条目?我对gluonfx-maven-plugin的配置

代码语言:javascript
运行
复制
<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()返回应用程序的版本?我在相应文件里找不到什么东西。此外,相关问题 in GraalVM已于2020年解决。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-21 17:56:47

假设您有一个Maven项目并将其添加到您的主应用程序类中:

代码语言:javascript
运行
复制
@Override
public void start(Stage primaryStage) throws Exception {
    ...
    System.out.println("Main class version: " + getClass().getPackage().getImplementationVersion());
}

如果您使用树荫插件做了一个胖jar,并在运行时负责添加所需的清单条目,比如Implementation-Version (比方说1.0):

代码语言:javascript
运行
复制
java --module-path=PATH_TO_FX --add-modules javafx.controls,javafx.fxml -jar my-fat-jar.jar

它应印刷:

代码语言:javascript
运行
复制
Main class version: 1.0

但是如果你跑

代码语言:javascript
运行
复制
mvn javafx:run

它打印:

代码语言:javascript
运行
复制
Main class version: null

正如你所报告的。

原因是:类路径中没有显式,类(target/classes)也没有打包在jar中。

如果您的项目有第三方依赖项,其中包含带有Implementation-Version条目的清单(例如2.0),则执行以下操作:

代码语言:javascript
运行
复制
@Override
public void start(Stage primaryStage) throws Exception {
    ...
    System.out.println("3rd party Main class version: " + com.my.third.party.MainClass.class.getPackage().getImplementationVersion());
}

将发挥作用:

代码语言:javascript
运行
复制
mvn javafx:run
[INFO] --- javafx-maven-plugin:0.0.8:run (default-cli) @ MyProject ---
3rd party Main class version: 2.0.

因为jar是带有清单的打包类的依赖项。

执行本机映像mvn gluonfx:build gluonfx:nativerun也是有效的:

代码语言:javascript
运行
复制
[INFO] --- gluonfx-maven-plugin:1.0.10:nativerun (default-cli) @ MyProject ---
[Mon Dec 20 21:29:16 CET 2021][INFO] ==================== RUN TASK ====================
[Mon Dec 20 21:29:16 CET 2021][INFO] [SUB] 2021-12-20 21:29:16.810 MyProject[23068:414510] Starting Gluon VM...
[Mon Dec 20 21:29:16 CET 2021][INFO] [SUB] Dec 20, 2021 9:29:16 PM com.sun.javafx.application.PlatformImpl startup
[Mon Dec 20 21:29:16 CET 2021][INFO] [SUB] WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @21c815e4'
[Mon Dec 20 21:29:16 CET 2021][INFO] [SUB] 3rd party Main class version: 2.0

因此,在这一点上,我看到三个选择:

  • 将核心代码移动到模块中,发布jar,并将其作为依赖项添加到主项目中,这样就可以了。
  • 将清单键值移动到属性文件,并使用Maven资源插件。这应该与GluonFX插件一起使用(确保将属性扩展添加到资源列表中)。这应该是最简单的。
  • 在基板上提交一个问题以请求一个清单。到目前为止,基板从项目中创建一个jar,所以理论上它也可以有一个清单,并且它可以用来自插件配置的一些键值归档。添加清单很容易,问题是向配置添加更改以传递键值。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70426223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档