Где Freemarker загружает шаблоны в сгенерированном maven банке - PullRequest
0 голосов
/ 23 мая 2018

Позвольте мне уточнить мою текущую практику.У меня есть проект maven и архитектура пакета выглядит следующим образом:
src / main / java / com / gearon / app / App.java
src / main / java / com / gearon / app / configuration/Config.java
src / main / java / com / gearon / app / datamodel / *. Java

Я попытался установить каталог, куда загружать шаблоны в Config.java, с кодом ниже:

    cfg = new Configuration();
    cfg.setClassForTemplateLoading(Config.class, "/templates");
    cfg.setDefaultEncoding("UTF-8");
    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

Я поместил шаблоны в src / main / java / com / gearon / app / templates
Архитектура src / main / java / com /gearon / app / templates / *. ftl

Работает нормально, если я запускаю код напрямую с методом main.Однако, когда я упаковываю проект в jar, он не загружает шаблоны, и ошибка выглядит следующим образом:

java.io.FileNotFoundException: Template "index.ftl" not found.

Я хотел бы знать, куда поместить эти шаблоны.

1 Ответ

0 голосов
/ 23 мая 2018

Хммм, на основе исследования руководства с официального сайта Freemarker

void setClassForTemplateLoading (Class cl, String basePackagePath) и void setClassLoaderForTemplateLoading (ClassLoader classLoader, String basePackagePath):предназначены для тех случаев, когда вы хотите загружать шаблоны через тот же механизм, с помощью которого Java загружает классы (из пути к классам, как они обычно говорили неопределенно).Скорее всего, это предпочтительный способ загрузки шаблонов для производственного кода, поскольку он позволяет вам хранить все внутри файлов jar развертывания.Первый параметр определяет, какой Java ClassLoader будет использоваться.Второй параметр указывает пакет, который содержит шаблоны в / -разделенном формате.Обратите внимание, что если вы не начнете его с /, он будет интерпретирован относительно пакета параметра Class.

Примечание имеет значение:

Примечаниечто если вы не начнете его с /, он будет интерпретирован относительно пакета параметра Class.

После изменения
cfg.setClassForTemplateLoading(Config.class, "/templates");
на
cfg.setClassForTemplateLoading(Config.class, "templates");

Все отлично работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...