Загрузка шаблонов Velocity из вложенных JAR-файлов

У меня есть приложение, упакованное внутри onejar, которое использует Velocity для создания шаблонов.

В моей настройке проекта maven у меня есть файл в $base/src/main/resources/template.html. Когда приложение упаковывается как onejar, полученный onejar содержит внутри себя вложенный jar (в main/my-jar.jar). Эта банка, в свою очередь, имеет этот файл template.html, упакованный под своим корнем. (Видимо, maven скопировал его из src/main/resources в корень пакета)

Я хотел бы загрузить этот шаблон в качестве ресурса в Velocity. Я читал, что для этого мне нужно использовать ClassPathResourceLoader, поэтому у меня есть код, который выглядит так:

    VelocityEngine ve = new VelocityEngine();
    ve.setApplicationAttribute("resource.loader", "class");

    ve.setApplicationAttribute("class.resource.loader.class", 
                               org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader.class);

    ve.init();
    Template t = ve.getTemplate("template.html");

Это не удается каждый раз, за ​​исключением того, что ни один из загрузчиков ресурсов Velocity не может найти файл.

У меня два вопроса: во-первых, это правильный способ настройки использования ClasspathResourceLoader? И во-вторых, если бы это было настроено правильно, какой путь я бы указал, чтобы template.html можно было найти внутри этого внутреннего вложенного банка?


person FrobberOfBits    schedule 08.05.2014    source источник


Ответы (2)


Мне удалось найти ответ после долгих копаний.

Код для использования ClasspathResourceLoader выглядит следующим образом:

VelocityEngine ve = new VelocityEngine();

ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); 
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

ve.init();

Во-вторых, многие люди говорят мне, что внутри вложенного jar стандартный загрузчик пути к классам не должен даже найти файл template.html. Мне сказали, что потребуется какой-нибудь причудливый сторонний загрузчик классов. OneJar предоставляет такой причудливый загрузчик. Как только я получил правильный код для использования ClasspathResourceLoader, все, казалось, решилось.

Следует помнить, что «/» относится к корню пути к классам. Поэтому, когда $base/src/main/resources/template.html был переупакован как template.html в корневом каталоге распакованного JAR, это означало, что /template.html был правильным путем загрузки ресурсов.

Этот путь /template.html, конечно, относится к вложенному внутреннему JAR. Как загрузчик классов (будь то стандартный или OneJar) не запутался между / внешней банки и внутренней банки, я не знаю.

person FrobberOfBits    schedule 12.05.2014

укажите путь, по которому находится ваш template.html, используя / в качестве относительного пути

и используйте setProperty как показано ниже

VelocityEngine ve = new VelocityEngine();
            ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
            ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

            ve.init();

            final String templatePath = "/" + template + ".html";


            Template template = ve.getTemplate(templatePath, "UTF-8");
person Karibasappa G C    schedule 12.05.2014