1

我有一个使用 Maven 管理的小型命令行实用程序项目。该实用程序是一个非常简单的应用程序,用于填充 Velocity 模板并将结果转储到新文件中。我的问题是在哪里放置我的 Velocity 模板。当我把它们放进去时src/test/resources/foo/bar/bazmvn 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并通过测试的地方是项目的根目录,即作为 and 的对等srctarget

4

5 回答 5

2

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

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

VelocityEngine engine = new VelocityEngine();
engine.init(props);
engine.evaluate(...);
于 2011-07-29T17:38:41.577 回答
1

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

于 2009-01-12T12:02:12.173 回答
0

所以事实证明,而不是使用类似的东西

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

我应该使用类似的东西

InputStream fooStream = getClass().getResourceAsStream("foo.yaml");
generator.mergeTemplate(fooStream, writer);
于 2009-01-21T20:18:10.923 回答
0

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

于 2009-02-02T22:40:42.517 回答
0

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

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

ve.init();
于 2014-07-17T06:39:33.043 回答