0

次のような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 によって使用されることです。

ポインタはありますか?

4

3 に答える 3

0

2つの問題があります。

is = ClassLoader.getSystemResourceAsStream("/"+PROPERTILES_FILE);

is = Thread.currentThread().getContextClassLoader().getResourceAsStream("/"+PROPERTILES_FILE);

クラスローダーから直接リソースをロードする場合は、先頭に「/」文字を使用しないでください。

先頭の「Class.getResourceAsStream()/」を使用します(リソースはクラスのパッケージに関連してロードされるため)が、先頭の「/」は使用ClassLoader.getResourceAsStream()getSystemResourceAsStream()ませ

于 2013-02-16T02:17:16.660 に答える
0

次の行を置き換える必要があります。

InputStream is = ClassLoader.getSystemResourceAsStream(PROPERTILES_FILE);

と:

InputStream is = Config.class.getClassLoader().getResourceAsStream(PROPERTILES_FILE);

war のルートにあるルートで現在の webapp クラスローダーを使用するには..

于 2013-02-16T01:07:14.137 に答える