Где мне разместить файлы шаблонов Velocity для утилиты командной строки, созданной с помощью Maven? - PullRequest
1 голос
/ 12 января 2009

У меня есть небольшой служебный проект командной строки, которым я управляю с помощью Maven. Утилита представляет собой очень простое приложение для заполнения шаблона Velocity и вывода результатов в новый файл. Моя проблема в том, где разместить мои шаблоны Velocity. Когда я помещаю их в src/test/resources/foo/bar/baz, mvn test терпит неудачу, потому что не может найти указанный шаблон, даже если он явно присутствует в target/classes/foo/bar/baz, где находится файл .class для теста и тестируемого класса расположены. Если я помещу шаблон в директорию верхнего уровня проекта, тест пройден, но тогда я не следую структуре проекта Maven и подозреваю, что фактический упакованный файл .jar не будет работать. Чего мне не хватает?

UPDATE:

Тестируемый метод :

public final void mergeTemplate(final String templateFileName, final Writer writer) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, IOException, Exception {
    Velocity.init();
    Velocity.mergeTemplate(templateFileName, Charset.defaultCharset().name(), context(), writer);
}

Метод испытания :

@Test
public void testMergeTemplate() throws Exception {
    final FooGenerator generator = new FooGenerator();
    final StringWriter writer = new StringWriter();
    generator.mergeTemplate("foo.yaml", writer);
    Assert.assertEquals("Something went horribly, horribly wrong.", EXPECTED_RESULT, writer.toString().trim());
}

Единственное место, где я могу разместить foo.yaml и пройти тестирование, находится в корневом каталоге проекта, то есть в качестве узла src и target.

Ответы [ 5 ]

2 голосов
/ 29 июля 2011

Вы можете программно настроить TEMPLATE_ROOT следующим образом:

Properties props = new Properties();        
props.put("file.resource.loader.path", templateRootDir);

VelocityEngine engine = new VelocityEngine();
engine.init(props);
engine.evaluate(...);
1 голос
/ 12 января 2009

Вы должны поместить их в src / main / resources / foo / bar / baz, потому что они должны быть включены в основной файл jar.

0 голосов
/ 17 июля 2014

Я попытался Velocity.setProperty (), чтобы установить свойства, подобные тому, что было сказано выше @Jin Kim и смог запустить его.

VelocityEngine ve = new VelocityEngine();
ve.setProperty(RunTimeConstants.RESOURCE_LOADER,"file");
ve.setProperty("file.resource.loader.path",templaterootdir);

ve.init();
0 голосов
/ 03 февраля 2009

Вы можете просто настроить Velocity для использования ClasspathResourceLoader вместо FileResourceLoader по умолчанию.

0 голосов
/ 21 января 2009

Так получается, что вместо использования что-то вроде

generator.mergeTemplate("foo.yaml", writer);

Я должен использовать что-то вроде

InputStream fooStream = getClass().getResourceAsStream("foo.yaml");
generator.mergeTemplate(fooStream, writer);
...