You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GraalVM原生镜像执行时Freemarker类不必要警告的消除方案

解决Freemarker在GraalVM原生镜像中Java9/16支持类缺失警告的方法

1. 修正GraalVM构建参数的包名错误

你之前使用的构建参数包名有误,警告中提示的类属于freemarker.core包,而非org.freemarker。需要将构建参数改为正确的全类名:

  • 使用--include-classes强制包含类:
    --include-classes=freemarker.core._Java9Impl,freemarker.core._Java16Impl
    
  • 或者如果需要在构建阶段初始化类,使用:
    --initialize-at-build-time=freemarker.core._Java9Impl,freemarker.core._Java16Impl
    
    在native-maven-plugin中的配置示例:
    <plugin>
      <groupId>org.graalvm.buildtools</groupId>
      <artifactId>native-maven-plugin</artifactId>
      <version>0.9.28</version>
      <executions>
        <execution>
          <id>build-native</id>
          <goals>
            <goal>compile-no-fork</goal>
          </goals>
          <configuration>
            <buildArgs>
              <buildArg>--include-classes=freemarker.core._Java9Impl,freemarker.core._Java16Impl</buildArg>
            </buildArgs>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

2. 修正代码引用的类包名

你添加的引用代码中,类的包名需要调整为freemarker.core,确保GraalVM的静态分析能检测到这些类的引用:

import freemarker.core._Java9;
import freemarker.core._Java9Impl;
import freemarker.core._Java16;
import freemarker.core._Java16Impl;
import java.time.LocalDate;

// 在应用初始化逻辑中添加(无需实际执行,仅用于触发类引用)
static {
    _Java9 j9 = _Java9Impl.INSTANCE;
    _Java16 j16 = _Java16Impl.INSTANCE;
    if (LocalDate.now().isBefore(LocalDate.of(1970, 1, 1))) {
        System.out.println(j9.toString() + j16.toString());
    }
}

3. 导入Freemarker官方GraalVM配置

Freemarker提供了适配原生镜像的配置文件,可通过以下方式引入:

  • 在项目中创建src/main/resources/META-INF/native-image/freemarker/native-image.properties文件,写入:
    Args=--include-classes=freemarker.core._Java9Impl,freemarker.core._Java16Impl
    
    GraalVM构建时会自动读取该配置,确保指定类被包含进原生镜像。

内容的提问来源于stack exchange,提问作者Dominik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:52:46