2009-01-12 19 views
1

我有一個使用Maven管理的小型命令行實用程序項目。該實用程序是一個非常簡單的應用程序,用於填充Velocity模板並將結果轉儲到新文件。我的問題是在哪裏放置我的Velocity模板。當我將它們放入src/test/resources/foo/bar/baz時,mvn test因爲找不到引用的模板而失敗,儘管它明顯存在於target/classes/foo/bar/baz中,這是測試文件和測試類所在的位置。如果我將模板放在項目的頂層目錄中,測試通過了,但是我沒有遵循Maven項目結構,我懷疑實際打包的.jar文件不起作用。我錯過了什麼?我應該在哪裏放置用Maven構建的命令行實用程序的Velocity模板文件?

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

回答

0

所以事實證明,而不是使用像

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

我應該使用類似

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

您應該將它們放在src/main/resources/foo/bar/baz中,因爲它們需要包含在主jar文件中。

+0

不夠公平。現在我把它們放在哪裏來讓我的單元測試通過? – 2009-01-12 14:16:35

0

你可以只配置速度使用ClasspathResourceLoader,而不是默認的FileResourceLoader。

2

您可以通過編程配置TEMPLATE_ROOT如下:

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

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

我已經試過Velocity.setProperty()來設置類似於上面通過@Jin金正日說的屬性,並能運行它。

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

ve.init(); 
相關問題