2011-01-03 27 views
12

jarからプロパティファイルをロードする必要があります。 jarファイルはwarファイルに含まれています。ここでは、次のような構造warファイルにパッケージ化されたjarファイルからリソースをロードする方法は?

ROOT.war 
    WEB-INF 
    lib 
     my.jar 

here my.jar has following structure 

my.jar 
    com 
    test 
     myservlet.class 
    WEB-INF 
    test.property 

は今、私は私のサーブレットの1に次のコードを書かれているされています

InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/test.properties"); 
Properties prop = new Properties(); 
prop.load(stream); 

をが、コードの上に、私はヌルとしてストリームを得ました。 ROOT.war/WEB-INFにプロパティファイルを置くとうまくいきます。 getResourceAsStream内のパスがコンテキストルート内のリソースを検索するよりも「/」で始まる場合、私は公正なアイデアを持っています。しかし、再びrootアプリケーションのWEB-INF/libにあるjarファイルにあるリソースを読み取ることはできますか?

おかげ&よろしく、 アミットパテル

答えて

35

JARのルートに置いて、servletcontextではなくコンテキスト・クラスローダーで取得します。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("test.properties"); 
// ... 

/WEB-INFフォルダの規則は、WARファイルに固有であり、JARファイルには適用されません。それを取り除く。クラスパスの一部となる個別のJARフォルダが本当に必要な場合は、代わりに/META-INFを使用してください。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("META-INF/test.properties"); 
// ... 
+0

... "WEB-INF/test.property"をそのまま使用してください。 –

+0

@bkailでも可能ですが、 'WEB-INF'フォルダを使用する理由はありません。なぜなら、これはサーブレットコンテキストではアクセスできないからです。また、プレーンなバニラJARファイルにWAR固有のフォルダ規約を置くことは意味がありません。 – BalusC

+0

合意した、あなたの答えが間違っていたことを暗示するつもりはありませんでした。 JAR構造を変更する場合にOPを別のオプションで提供するだけでは、何らかの理由で困難または不可能です。 –

6

あなたはあなたの「がmyservlet」クラス(悪い命名)から、たとえば特定のインスタンスから

this.getClass().getResourceAsStream("name"); 

を標準のクラスパス上の任意のリソースにアクセスすることができます。

getServletContext().getResourceAsStream()は、Webアプリケーションのベースディレクトリのコンテキストでコンテンツにアクセスします。

jarファイルにWEB-INFディレクトリを含めないと、スタイルが悪いようです。混乱の原因になります。あなたはより良い名前を見つけることができませんか?

2

これは私が見つけたもので、それは私のために働いたものです。 @BalusCが提供してくれた助けは私のために働いた。私は見つけたものと、それが働いていることをどのように確認したのかを照合しました。

私はこのプロジェクトをビルドするとき、今すぐ

project structure

以下のように私は次のような構造を持つMavenプロジェクトを持っています。瓶は

enter image description here

、ここqueries.properties "META-INF" フォルダの下動くように見えます。ここでこのプロパティファイルを利用しようとしているクラスがこのプロパティファイルを使用しようとしている場合、プロジェクト構造に示されているようにリソースフォルダの下で同じファイルにアクセスすることができると考えると間違っていると思います。正しい方法は、META-INFフォルダを経由してアクセスすることです

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream is = classLoader.getResourceAsStream("META-INF/queries.properties"); 

どのように私は、単純なJavaプロジェクトを作成して、あなただけのビルド・パスに作成したjarファイルが含まれており、インスタンスを作成し

を検証しました上記のようなClassLoaderステートメントを持つクラスです。この新しいJavaプロジェクトでのあなたのコードはQueriesは、あなたは自分のビルド・パスに含まれているjarファイル内のクラスがある

public static void main(String[] args){ 
     new Queries(); 
    } 

のようになります。

関連する問題