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

Quarkus 3.6.4中Freemarker Template Not Found异常求助

解决Quarkus 3.6.4集成Freemarker时的TemplateNotFoundException异常

问题场景

配置Quarkus 3.6.4应用集成Freemarker后,执行mvnw quarkus:dev启动服务,访问/hello?name=max时抛出模板找不到的异常。

错误日志

2024-01-12 10:02:11,412 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-1) HTTP Request to /hello?name=max failed, error id: 1dac2036-f070-415a-9ef4-cad4ebfdbed7-1: java.lang.RuntimeException: Error injecting freemarker.template.Template org.acme.HelloResource.hello
        at org.acme.HelloResource_Bean.doCreate(Unknown Source)
        at org.acme.HelloResource_Bean.create(Unknown Source)
        at org.acme.HelloResource_Bean.create(Unknown Source)
        at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:117)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:41)
        at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
        at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:32)
        at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
        at ...
Caused by: jakarta.enterprise.inject.CreationException: freemarker.template.TemplateNotFoundException: Template not found for name "hello.ftl".
The name was interpreted by this TemplateLoader: MultiTemplateLoader(loader1 = ClassTemplateLoader(classLoader="QuarkusClassLoader:Quarkus Runtime ClassLoader: DEV for caronte-1.0.0-SNAPSHOT restart no:0@6de0f580", basePackagePath="freemarker/templates/")).
        at io.quarkiverse.freemarker.runtime.FreemarkerTemplateProducer_ProducerMethod_getTemplate_l8tBZCOFgJ9DySmRlLH9CkgP6Lw_Bean.create(Unknown Source)
        at io.quarkiverse.freemarker.runtime.FreemarkerTemplateProducer_ProducerMethod_getTemplate_l8tBZCOFgJ9DySmRlLH9CkgP6Lw_Bean.get(Unknown Source)
        at io.quarkiverse.freemarker.runtime.FreemarkerTemplateProducer_ProducerMethod_getTemplate_l8tBZCOFgJ9DySmRlLH9CkgP6Lw_Bean.get(Unknown Source)
        at io.quarkus.arc.impl.CurrentInjectionPointProvider.get(CurrentInjectionPointProvider.java:48)
        ... 29 more
Caused by: freemarker.template.TemplateNotFoundException: Template not found for name "hello.ftl".
The name was interpreted by this TemplateLoader: MultiTemplateLoader(loader1 = ClassTemplateLoader(classLoader="QuarkusClassLoader:Quarkus Runtime ClassLoader: DEV for xxx-1.0.0-SNAPSHOT restart no:0@6de0f580", basePackagePath="freemarker/templates/")).
        at freemarker.template.Configuration.getTemplate(Configuration.java:2957)
        at freemarker.template.Configuration.getTemplate(Configuration.java:2759)

pom.xml关键配置

...
  <properties>
    <compiler-plugin.version>3.11.0</compiler-plugin.version>
    <maven.compiler.release>21</maven.compiler.release>
    <quarkus.platform.version>3.6.4</quarkus.platform.version>
    <skipITs>true</skipITs>
    <surefire-plugin.version>3.1.2</surefire-plugin.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-arc</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-reactive</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkiverse.freemarker</groupId>
      <artifactId>quarkus-freemarker</artifactId>
      <version>1.0.0</version>
    </dependency>
    ...
  </dependencies>
 ...

控制器代码

@Path("hello")
public class HelloResource {
    @Inject
    @TemplatePath("hello.ftl")
    Template hello;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello(@QueryParam("name") String name) throws IOException, TemplateException {
        StringWriter stringWriter = new StringWriter();
        hello.process(Map.of("name", name), stringWriter);
        return stringWriter.toString();
    }
}

模板文件信息

  • 路径:/src/main/resources/freemarker/templates/hello.ftl
  • 内容:
Hello ${name}!

解决方案

1. 修复依赖版本兼容性

quarkus-freemarker 1.0.0仅适配Quarkus 2.x版本,Quarkus 3.x需要使用2.x系列的依赖版本。修改pom.xml中的freemarker依赖:

<dependency>
  <groupId>io.quarkiverse.freemarker</groupId>
  <artifactId>quarkus-freemarker</artifactId>
  <version>2.0.0</version>
</dependency>

更规范的做法是通过Quarkus平台BOM管理依赖版本,避免手动指定版本时出现兼容性问题。

2. 验证模板路径与文件名

确保模板文件确实存在于src/main/resources/freemarker/templates/目录下,且文件名(包括大小写)与@TemplatePath注解中的完全一致(Linux/macOS系统区分文件名大小写)。

3. 清理并重新构建

执行以下命令清理旧构建产物,再启动开发模式:

mvnw clean install
mvnw quarkus:dev

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:12:14