MavenでビルドされたコマンドラインユーティリティのVelocityテンプレートファイルはどこに置くべきですか?
-
10-07-2019 - |
質問
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
を配置してテストに合格させることができる唯一の場所は、プロジェクトのルートディレクトリ、つまり src
とターゲット
。
解決 3
つまり、次のようなものを使用する代わりに
generator.mergeTemplate("foo.yaml", writer);
次のようなものを使用する必要があります
InputStream fooStream = getClass().getResourceAsStream("foo.yaml");
generator.mergeTemplate(fooStream, writer);
他のヒント
次のように、TEMPLATE_ROOTをプログラムで構成できます。
Properties props = new Properties();
props.put("file.resource.loader.path", templateRootDir);
VelocityEngine engine = new VelocityEngine();
engine.init(props);
engine.evaluate(...);
メインjarファイルに含める必要があるため、src / main / resources / foo / bar / bazに配置する必要があります。
デフォルトのFileResourceLoaderの代わりにClasspathResourceLoaderを使用するようにVelocityを構成できます。
Velocity.setProperty()を試して、@ Jin Kimが上記で述べたものと同様のプロパティを設定し、実行できました。
VelocityEngine ve = new VelocityEngine();
ve.setProperty(RunTimeConstants.RESOURCE_LOADER,"file");
ve.setProperty("file.resource.loader.path",templaterootdir);
ve.init();