- PR -

MavenでClassLoader#getResourceAs...()できない

1
投稿者投稿内容
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-02-21 20:19

お世話になります。

MavenからJUnitテストを実行する際、ClassLoader#getResourceAsStrem()
でリソース(*.properties)をロードできずに困っています。

具体的には、あるテスト対象クラスの中で、
コード:

private static final String CONFIG_FILE = "config.properties";
...
Properties props = new Properties();
try {
props.load(getClass().getClassLoader().getSystemResourceAsStream( CONFIG_FILE ));
}
catch(Exception e) {
// ...
}


のようなコードでプロパティファイルをロードしているのですが、ここで
コード:

BUILD FAILED
File...... file:/c:/home/.maven/plugins/maven-test-plugin-1.4/
Element... junit
Line...... 94
Column.... 39
java.lang.NoClassDefFoundError
Total time: 3 seconds
Finished at: Sat Feb 21 20:14:50 JST 2004


となってしまい、テストが失敗します。
普段はCygwin(bash)を使っていますが、DOSやMavenIDE-EclipsePlugIn上から
maven testを実行しても結果は同じでした。

その際出力されるJUnitテストレポートには次のようなスタックトレースがでています。
コード:

Caused by: java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:61)
at java.io.InputStreamReader.<init>(InputStreamReader.java:80)
at java.util.Properties.load(Properties.java:266)


上記から原因はMavenのテスト実行時のクラスパス上にロードしようとしている
config.propertiesが存在しないのだと思います。

# Mavenではなく、AntやEclipse上でテストを実行する際はconfig.properties
# をクラスパスに設定して正常にテストが動作しています。

Mavenのproject.xmlは以下のようにしています。(抜粋)
resources要素を使ってテスト実行時のクラスパスに設定するリソースを
指定できるものと思っています。
コード:

<build>
<nagEmailAddress>hoge@hoge.com</nagEmailAddress>
<sourceDirectory>src</sourceDirectory>
<unitTestSourceDirectory>test</unitTestSourceDirectory>
<unitTest>
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/AllTests.java</exclude>
</excludes>
<resources>
<resource>
<directory>${basedir}/conf</directory>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</unitTest>
</build>



プロジェクトのディレクトリ構成は以下のとおりです。
コード:

project
|
+-/src
|
+-/test
|
+-/conf
| |
| +-config.properties
|



この設定で動作すると思ったのですが...何かお気づきの点がありましたらご教授下さい。

尚、当方の環境は、
OS : Windows XP Professional
J2SE : 1.4.2
Maven : 1.0 RC1
です。

宜しくお願いします。

#タイプミスがあったので修正しました

[ メッセージ編集済み 編集者: YOU@IT 編集日時 2004-02-21 20:21 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-02-21 23:50
ClassLoader#getSystemResourceは$java_home/jre/lib/extディレクトリにjarファイルとし
て配備することでアクセスすることができるそうです。
projectがclass pathとして含まれているはずなので、ClassLoader#getSystemResourceではなく、ClassLoader#getResourceを試してみてはいかがでしょう。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-02-22 01:08

かずくん さんご回答ありがとうございます。

ご指摘の通りでした。
ClassLoader#getResourceAsStream()で無事動作しました。

と言うか自分では、#getSystemResourceAsStream()ではなく#getResourceAsStream()
を使っているつもりでしたが...コードの記述ミスでした。お恥ずかしい...
お騒がせしてすみませんでした。

あとお騒がせついでにすみませんが、
> ClassLoader#getSystemResourceは$java_home/jre/lib/extディレクトリに
> jarファイルとして配備することでアクセスすることができるそうです。
の情報源を教えていただけませんか?

宜しくお願いします。

1

スキルアップ/キャリアアップ(JOB@IT)