Package#getImplementationVersion() returns null with native image (GraalVM/GluonFX)
Package#getImplementationVersion() returns null with native image (GraalVM/GluonFX)
我有一个基于 JavaFX 的桌面应用程序,我通过 GraalVM/GluonFX 创建了本机图像。为了在运行时检索应用程序的版本,我以前——当应用程序只有一个胖 JAR 时——使用 Package#getImplementationVersion()
。然而,这个returnsnull
.
我想这是因为我没有正确设置清单条目?我的配置是 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()
returns 应用程序的版本?我无法在 GraalVM 的 corresponding documentation. Also, a related issue 中找到某些内容已在 2020 年解决。
假设您有一个 Maven 项目并添加到主应用程序 class:
@Override
public void start(Stage primaryStage) throws Exception {
...
System.out.println("Main class version: " + getClass().getPackage().getImplementationVersion());
}
如果你用 shade 插件做一个 fat jar 并注意添加所需的清单条目,如 Implementation-Version
(假设 1.0
),当你 运行:
java --module-path=PATH_TO_FX --add-modules javafx.controls,javafx.fxml -jar my-fat-jar.jar
它应该打印:
Main class version: 1.0
但是如果你运行
mvn javafx:run
它打印:
Main class version: null
正如您所报告的那样。
原因:class路径中没有清单,classes (target/classes
) 没有打包在 jar 中。
如果您的项目具有第三方依赖项,其中包含带有 Implementation-Version
条目的清单(假设 2.0
),请执行:
@Override
public void start(Stage primaryStage) throws Exception {
...
System.out.println("3rd party Main class version: " + com.my.third.party.MainClass.class.getPackage().getImplementationVersion());
}
将工作:
mvn javafx:run
[INFO] --- javafx-maven-plugin:0.0.8:run (default-cli) @ MyProject ---
3rd party Main class version: 2.0.
因为 jar 是带有清单的打包 classes 的依赖项。
并且制作原生图像 mvn gluonfx:build gluonfx:nativerun
也有效:
[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
所以此时我看到三个选项:
我有一个基于 JavaFX 的桌面应用程序,我通过 GraalVM/GluonFX 创建了本机图像。为了在运行时检索应用程序的版本,我以前——当应用程序只有一个胖 JAR 时——使用 Package#getImplementationVersion()
。然而,这个returnsnull
.
我想这是因为我没有正确设置清单条目?我的配置是 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()
returns 应用程序的版本?我无法在 GraalVM 的 corresponding documentation. Also, a related issue 中找到某些内容已在 2020 年解决。
假设您有一个 Maven 项目并添加到主应用程序 class:
@Override
public void start(Stage primaryStage) throws Exception {
...
System.out.println("Main class version: " + getClass().getPackage().getImplementationVersion());
}
如果你用 shade 插件做一个 fat jar 并注意添加所需的清单条目,如 Implementation-Version
(假设 1.0
),当你 运行:
java --module-path=PATH_TO_FX --add-modules javafx.controls,javafx.fxml -jar my-fat-jar.jar
它应该打印:
Main class version: 1.0
但是如果你运行
mvn javafx:run
它打印:
Main class version: null
正如您所报告的那样。
原因:class路径中没有清单,classes (target/classes
) 没有打包在 jar 中。
如果您的项目具有第三方依赖项,其中包含带有 Implementation-Version
条目的清单(假设 2.0
),请执行:
@Override
public void start(Stage primaryStage) throws Exception {
...
System.out.println("3rd party Main class version: " + com.my.third.party.MainClass.class.getPackage().getImplementationVersion());
}
将工作:
mvn javafx:run
[INFO] --- javafx-maven-plugin:0.0.8:run (default-cli) @ MyProject ---
3rd party Main class version: 2.0.
因为 jar 是带有清单的打包 classes 的依赖项。
并且制作原生图像 mvn gluonfx:build gluonfx:nativerun
也有效:
[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
所以此时我看到三个选项: