VelocityでResourceNotFoundExceptionが発生する場合の対処法
【基本編】 どういった状況で ResourceNotFoundException が発生するか
VelocityのJavadocはとても不親切なので分かりづらいのですが、テンプレートファイルが指定した位置に存在しないことが大きな原因の1つです。
Templateクラスのインスタンスを生成するVelocityクラスもしくはVelocityEngineクラスのgetTemplateメソッドを呼ぶ際に、引数として与えたテンプレートファイルへのパスが誤っていることをまず疑ってください。
- ファイル名は誤っていないか
- テンプレートファイルのあるディレクトリ名が誤っていないか
【発展編】 パスは誤っていないはずなのに ResourceNotFoundException が発生する場合
何度確認してもパスに間違いがない場合は、getTemplateメソッドの引数について次の点を確認しましょう。(FileResourceLoaderを利用している場合のみ)
・ 相対パスで指定しているか
・ XXX.resource.loader.path
・ XXX.resource.loader.path配下にあるファイルを指定しているか(サブディレクトリ内でも可)
3つ目が案外はまりやすいんじゃないでしょうか。
デフォルトでのresource.loader.pathはカレントディレクトリになっています。つまり、カレントディレクトリ配下にテンプレートファイルが配置されていないといけません。テンプレートファイルをカレントディレクトリ以外に配置したい場合は、resource.loader.pathを適切に設定する必要があります。
また、Windows環境で実行している場合は次の点も確認してみましょう。
・ XXX.resource.loader.pathを指定するとき、「\」でなくて「/」を利用しているか
【参考資料】
[wiki] Velocity - 気の向くままに
[web] Velocity - TECHSCOPE
[web] Apache Velocity (本家)
フォローしませんか?