我正在使用 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());
}
不幸的是没有成功,仍然显示两个警告。我该怎么做才能让这两个警告消失?
亲切的问候 多米尼克
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/)