Зареждане на шаблони за скорост от вложени JAR файлове

Имам приложение, пакетирано вътре в onejar, което използва Velocity за шаблониране.

В моята настройка на maven проект имам файл в $base/src/main/resources/template.html. Когато приложението бъде пакетирано като onejar, полученият onejar съдържа вложен буркан вътре в него (под 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();

Второ, много хора ми казват, че вътре във вложен буркан, стандартният зареждащ път на класове не би трябвало дори да може да намери файла template.html. Казаха ми, че ще е необходимо някакво изискано средство за зареждане на класове от трета страна. OneJar предоставя такъв фантастичен товарач. След като получих правилния код за използване на ClasspathResourceLoader, нещата изглеждаха разрешени.

Нещото, което трябва да имате предвид е, че "/" е относително към корена на classpath. Така че, когато $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