Maven生成Jar包后Freemarker模板加载失败,求助正确存放路径
解决Maven打包Jar后FreeMarker模板加载失败的问题
这个问题的核心根源是你违反了Maven的标准资源目录约定,导致模板文件没有被正确打包进Jar包中。
正确的模板文件位置
你需要把templates目录从src/main/java/com/gearon/app/下移动到src/main/resources/目录下,最终目录结构应该是:
src/main/resources/templates/*.ftl
Maven默认会把src/main/resources下的所有文件复制到编译后的target/classes目录,打包成Jar时也会完整包含这些资源文件,这样在运行Jar时就能通过类加载器正常找到模板了。
调整FreeMarker配置代码
你的配置代码可以保持基本逻辑,但更推荐使用类加载器的方式来加载模板,避免类路径歧义:
cfg = new Configuration(Configuration.VERSION_2_3_32); // 建议显式指定FreeMarker版本 // 使用线程上下文类加载器加载模板,路径直接写"templates"(无需开头的/) cfg.setClassLoaderForTemplateLoading(Thread.currentThread().getContextClassLoader(), "templates"); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
如果想继续使用原来的setClassForTemplateLoading方法,只需要确保路径匹配新的资源位置即可:
// 这里的"/templates"对应resources根目录下的templates文件夹 cfg.setClassForTemplateLoading(Config.class, "/templates");
为什么IDE运行正常但打包后失败?
IDE(比如IntelliJ IDEA或Eclipse)在运行项目时,会把src/main/java下的所有文件(包括非.java的模板文件)都当作资源加载到类路径中,所以能正常找到模板。但Maven的maven-jar-plugin默认只会编译src/main/java下的.java文件,其他类型的文件不会被复制到target/classes目录,自然也就不会被打包进Jar包,导致运行Jar时出现模板找不到的错误。
验证方法
打包完成后,你可以解压生成的Jar文件,检查是否存在/templates目录以及对应的.ftl文件。如果这些资源存在,说明打包配置正确,此时运行Jar就能正常加载模板了。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

