MavenでビルドされたコマンドラインユーティリティのVelocityテンプレートファイルはどこに置くべきですか?

StackOverflow https://stackoverflow.com/questions/435210

  •  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();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top