VelocityテンプレートエンジンのResourceNotFoundExceptionについて

2010/01/20 19:08Update
TAGS: テンプレートエンジン | Velocity | Apache | DAO | サンプル | ResourceNotFoundException

Velocityテンプレートエンジンを利用する際に、ResourceNotFoundException異常が投げ出された時の対処方法について。

Velocityテンプレートエンジンについて
Apache Velocity - 高機能なJavaベースのテンプレートエンジン

例:
Template template = Velocity.getTemplate("com/test/velocity/someTemplate.vm", "UTF-8");

が実行されるとき、次のようなResourceNotFoundExceptionが投げ出されました。

ResourceNotFoundException異常例:
Exception in thread "main" org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'com/test/velocity/someTemplate.vm'
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:452)
    at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:335)
    at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1102)
    at org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:324)
    at org.apache.velocity.app.Velocity.getTemplate(Velocity.java:524)
    at TestVelocity.main(TestVelocity.java:57)

プロジェクト(ソース)階層例:
src/com/test/velocity/someTemplate.vm
src/com/test/velocity/TestVelocity.class
になっています。無論、srcはclasspathに通っています。

コンパイル後の階層例:
classes/com/test/velocity/someTemplate.vm
classes/com/test/velocity/TestVelocity.class


調査した結果、リソースはどこにあるかをVelocityに知らせていないことが原因らしいです。

一応、解決策として、次のようなコードを追加すれば解決できます。

Properties p = new Properties();
p.setProperty("resource.loader", "class");
p.setProperty("class.resource.loader.class", 
            "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
p.setProperty("input.encoding", "UTF-8");
Velocity.init(p);


興味があれば、次の記事もご覧を。
テンプレートエンジンApache Velocityを使おう - VelocityでDAOの自動生成ツールを作成

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments