VelocityでResourceNotFoundExceptionが発生する場合の対処法

Javaで実装されたテンプレートライブラリApache Velocityは、メールのテンプレート生成等によく利用されています。そのVelocityライブラリを利用している際によく発生する ResourceNotFoundException(org.apache.velocity.exception.ResourceNotFoundException) の対処法についてまとめてみます。


【基本編】 どういった状況で ResourceNotFoundException が発生するか

VelocityのJavadocはとても不親切なので分かりづらいのですが、テンプレートファイルが指定した位置に存在しないことが大きな原因の1つです。
Templateクラスのインスタンスを生成するVelocityクラスもしくはVelocityEngineクラスのgetTemplateメソッドを呼ぶ際に、引数として与えたテンプレートファイルへのパスが誤っていることをまず疑ってください。

- ファイル名は誤っていないか
- テンプレートファイルのあるディレクトリ名が誤っていないか


【発展編】 パスは誤っていないはずなのに ResourceNotFoundException が発生する場合

何度確認してもパスに間違いがない場合は、getTemplateメソッドの引数について次の点を確認しましょう。(FileResourceLoaderを利用している場合のみ)
  ・ 相対パスで指定しているか
  ・ XXX.resource.loader.path(XXXは、リソースローダ名) プロパティからの相対パスになっているか
  ・ XXX.resource.loader.path配下にあるファイルを指定しているか(サブディレクトリ内でも可)

3つ目が案外はまりやすいんじゃないでしょうか。
デフォルトでのresource.loader.pathはカレントディレクトリになっています。つまり、カレントディレクトリ配下にテンプレートファイルが配置されていないといけません。テンプレートファイルをカレントディレクトリ以外に配置したい場合は、resource.loader.pathを適切に設定する必要があります。

また、Windows環境で実行している場合は次の点も確認してみましょう。
  ・ XXX.resource.loader.pathを指定するとき、「\」でなくて「/」を利用しているか


【参考資料】
[wiki] Velocity - 気の向くままに
[web] Velocity - TECHSCOPE
[web] Apache Velocity (本家)

前へ

Javaで行列式計算(余因子展開)

次へ

IEの設定によりVS2003でデバッグできなくなる現象