次のようなMavenプロジェクトのセットアップがあります
parent
...pom.xml
...servlet-app
......pom.xml ( specifies simple-lib as a dependency )
...simple-lib
......src/main/resources/config.properties
......src/main/java/package1/Config.java
......src/main/java/package1/HelloQuartzJob.java
基本的に、サーブレット アプリケーション servlet-app は依存関係として simple-lib を指定します。構成ファイル config.properties は、simple-lib.jar のトップ/レベルにパッケージ化されています。そして、servelet-app.war を解凍すると、WEB_INF/lib/simple-lib.jar が表示されます。だから、すべてが良いです。
Config.java は次のようになります。
public class Config{
static final String PROPERTILES_FILE = "config.properties";
static Properties props;
static{
log.info("Loading Config properties from {}", PROPERTILES_FILE);
props = new Properties();
try {
InputStream is = ClassLoader.getSystemResourceAsStream(PROPERTILES_FILE);
if (is == null) {
log.info("Loading through ClassLoader as root");
is = ClassLoader.getSystemResourceAsStream("/"+PROPERTILES_FILE);
}
if (is == null) {
log.info("Loading through Config.class. root");
is = Config.class.getResourceAsStream("/"+PROPERTILES_FILE);
}
if (is == null) {
log.info("Loading through Config.class. relative");
is = Config.class.getResourceAsStream(PROPERTILES_FILE);
}
if( is == null ) {
log.info("Thread class loader root");
is = Thread.currentThread().getContextClassLoader().getResourceAsStream("/"+PROPERTILES_FILE);
}
props.load(is);
} catch (Throwable e) {
log.error("Config properties loading error ", e);
throw new RuntimeException(e);
}
}
}
しかし、Tomcat7 にデプロイすると、NoClassDefFound/Could not initialize package1.Config エラーが発生します。これはclassLoadersが原因だと思います。
また興味深いのは、この package1.Config が、このサーブレット アプリケーション内で実行されるスケジューラ インスタンスによって実行される Quartz ジョブである HelloQuartzJob.java によって使用されることです。
ポインタはありますか?