我应该在哪里为用Maven构建的命令行实用程序放置Velocity模板文件?

时间:2009-01-12 11:54:01

标签: unit-testing maven-2 velocity

我有一个小型命令行实用程序项目,我正在使用Maven来管理。该实用程序是一个非常简单的应用程序,用于填充Velocity模板并将结果转储到新文件。我的问题是在哪里放置我的Velocity模板。当我将它们放入src/test/resources/foo/bar/baz时,mvn test失败,因为找不到引用的模板,即使它target/classes/foo/bar/baz中明显存在,.class文件也是如此用于测试和被测试的课程。如果我将模板放在项目的顶级目录中,测试通过,但是我没有遵循Maven项目结构,我怀疑实际打包的.jar文件不起作用。我错过了什么?

更新:

正在测试的方法

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并让测试通过的唯一地方是项目的根目录,即作为srctarget的同行。

5 个答案:

答案 0 :(得分:2)

您可以按以下方式以编程方式配置TEMPLATE_ROOT:

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

VelocityEngine engine = new VelocityEngine();
engine.init(props);
engine.evaluate(...);

答案 1 :(得分:1)

你应该将它们放在src / main / resources / foo / bar / baz中,因为它们需要包含在主jar文件中。

答案 2 :(得分:0)

事实证明,而不是使用像

这样的东西
generator.mergeTemplate("foo.yaml", writer);

我应该使用像

这样的东西
InputStream fooStream = getClass().getResourceAsStream("foo.yaml");
generator.mergeTemplate(fooStream, writer);

答案 3 :(得分:0)

您可以将Velocity配置为使用ClasspathResourceLoader,而不是默认的FileResourceLoader。

答案 4 :(得分:0)

我已经尝试过Velocity.setProperty()来设置类似于@Jin Kim上面所说的属性,并且能够运行它。

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

ve.init();