Загрузка шаблонов Freemarker извне classpath / jar - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь использовать FreeMarker для создания отчетов для разных агентов, которые работают в моем приложении.Я посмотрел онлайн, но нигде не смог найти, можно ли загрузить шаблоны, если они не находятся в папке ресурсов моего проекта.Поскольку мое приложение запускается из файлов * .jar, я пытался использовать:

public ReportTemplate(final String template_path)
        throws TemplateException, IOException {
    CFG.setDirectoryForTemplateLoading(new File("."));
    CFG.setDefaultEncoding("UTF-8");
    template = CFG.getTemplate(template_path);
}

, а затем в моем файле conf, где я передаю шаблон:

parameters: {
    report: /../test.ftl
}

*. Jar file иШаблон находится в той же папке, но, насколько я понимаю, мне сначала нужно выйти из файла JAR, а затем пойти и получить шаблон.Мне интересно, есть ли простой способ загрузить шаблоны для FreeMarker, не помещая их в папку / resources / моего проекта (таким образом, когда кто-то еще использует приложение, он может создать свой собственный шаблон и просто скопировать его в папку).Я также хотел бы не использовать жестко закодированные пути, такие как "/ tmp /", поэтому я использую "."путь к текущему местоположению.

1 Ответ

1 голос
/ 01 апреля 2019

Можно загружать шаблоны практически из любого места, а также загружать шаблоны из разных мест. Но я подозреваю, что здесь есть несколько недоразумений.

Существует только одно свойство cfg.templateLoader. cfg.setDirectoryForTemplateLoading(dir) - это просто сокращение удобства для cfg.setTemplateLoader(new FileTemplateLoader(dir)), а cfg.setClassForTemplateLoading(...) - это просто сокращение удобства для cfg.setTemplateLoader(new ClassTemplateLoader(...)). Если вам нужно загрузить оба механизма (из произвольного каталога и из jar-s на пути к классам Java), вам нужно использовать cfg.setTemplateLoader(new MultiTemplateLoader(new TemplateLoader[] { new FileTemplateLoader(dir), new ClassTemplateLoader(...) })). Теперь, если вы попытаетесь загрузить foo/bar.ftl, сначала FileTemplateLoader попытается загрузить foo/bar.ftl относительно своего собственного базового каталога, а если он не найден, ClassTemplateLoader попытается загрузить foo/bar.ftl относительно его собственный базовый пакет. Два TemplateLoader являются полностью независимыми деревьями виртуальных каталогов, которые не знают друг друга. Это просто MultiTemplateLoader, который накладывает два дерева друг на друга через механизм отката, который я только что показал.

Также обратите внимание, что ClassTemplateLoader не знает о местонахождении банок или о том, задействованы ли банки вообще. Он просто просит Java ClassLoader найти и загрузить ресурсы.

Также обратите внимание, что использование new File(".") обычно является плохой идеей, поскольку в большинстве приложений у вас нет хорошего контроля над тем, каким будет текущий рабочий каталог во время создания TemplateLoader. Обычно вместо этого у вас есть абсолютный путь в некотором файле конфигурации, или он передается как аргумент командной строки FreeMarker все равно, как вы это делаете.

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