本机图像执行时 Freemarker 类出现不必要的警告

问题描述 投票:0回答:1

我正在使用 freemarker 开发一个命令行应用程序。我想使用 native-maven-plugin 将应用程序构建为 graalvm 本机映像。当我在命令行(MacOS 上为 zsh)启动应用程序时,我收到以下警告:

Aug. 01, 2024 10:25:29 PM freemarker.log._JULLoggerFactory$JULLogger warn
WARNUNG: Seems that the Java 9 support class (freemarker.core._Java9Impl) wasn't included in the build

Aug. 01, 2024 10:25:29 PM freemarker.log._JULLoggerFactory$JULLogger warn
WARNUNG: Seems that the Java 16 support class (freemarker.core._Java16Impl) wasn't included in the build

我已经尝试使用本机图像构建选项

_Java9Impl
在图像中包含两个类
_Java16Impl
--initialise-at-build-time=org.freemarker._Java9Impl
。没有成功。

我还尝试在我的应用程序中简单地使用这两个类,以便将它们包含在本机映像中。为此,我将以下代码添加到我的应用程序中,这实际上没有任何意义:

_Java9 j9 = _Java9Impl.INSTANCE;
_Java16 j16 = _Java16Impl.INSTANCE;
if (LocalDate.now().isBefore(LocalDate.of(1970,1,1))) {
    System.out.println(j9.toString() + j16.toString());
}

不幸的是没有成功,仍然显示两个警告。我该怎么做才能让这两个警告消失?

亲切的问候 多米尼克

java freemarker graalvm-native-image
1个回答
0
投票

freemarker.jar
很棘手,因为其中所有
class
-es 都是 Java 8 格式,除了您收到警告的两个类,它们是 Java 9 和 16 格式。然后 FreeMarkerker 检测运行时的 Java 版本,如果运行时版本足够高,则按名称动态加载这些类。不确定本机格式是否支持该格式。或者如果确实如此,但由于某种原因,这两个异常值类别被排除在外。

无论如何,在 2.3.34-SNAPSHOT 中,我现在已经切换到另一种技术,“JEP 238:多版本 JAR 文件”。它的作用是 jar 中有两个

freemarker.core._Java9Imp

 类。一个是 Java 8,另一个在 
META-INF/version/9
 内部,是 Java 9。我只是静态(通常)链接到 
_Java9Imp
,Java 运行时会将其解析为正确的变体。因此,如果这适用于 GraalVM Native,那么 
_Java9.INSTANCE.isSupported()
 应该返回 
true
(在 Java 9+ 上),以及 
_Java16.INSTANCE.isSupported()
(在 Java 16+ 上)。

您可以尝试一下这种 Multi-Release JAR 方法是否有效吗? (代码已推送到 Github 上,这里还有快照存储库:

https://repository.apache.org/content/repositories/snapshots/org/freemarker/freemarker/2.3.34-SNAPSHOT/

© www.soinside.com 2019 - 2024. All rights reserved.