2012-03-19 7 views
2

私はすでにこの問題によく似た投稿があることを知っていますが、私は自分のjarファイル内のこのファイルの場所を指定する権限がないので誰かがこれを回避するための解決策を知っていることを期待しています。ClassLoaderはファイルの間違ったインスタンスをロードします

私は現在、ファイルを入力ストリームとして取得するためにスニペットを使用しています。ファイル 'plugin.xml'はjarのルートにあり、別のソフトウェア(dynatrace)が作成するとこの場所を変更できませんこのファイルの場所を決定します。

標準スニペット:

InputStream is = JmxPlugin.class.getResourceAsStream("/plugin.xml");

今、私は問題はクラスローダは、クラスパスに沿って名前が一致する最初のファイル「のplugin.xml」を拾っているということであることを認識しています(1つのISN私の瓶の中で、yay)。

私はそれを移動することなく正しいファイルを確実にピックアップする方法を誰も考えることができますか? jarファイルのクラスの相対パスはcom/something/jmx/JmxPlugin.classです。

(むしろメモリ内にjarファイルを展開する必要はありません)。すべての貢献のため

多くのおかげで、

+0

私はあなたの表現に混乱しています。ファイルがパスのルートにあるjarファイル内にあり、 "plugin.xml"を使用している場合は、それが呼び出しで使用する必要があるパスです。 fooパッケージに含まれている場合は、 "foo/plugin.xml"が必要です。それで問題は何ですか?あなたがあなたの瓶の中に入れたいファイルの場所を知っているならば、ファイルの場所を渡してください。 – Jon

+0

私の言葉がどういうふうに見えないのか分かりません。Sは基本的に何が起こっているのですか?ClassLoaderは、私のjarの前にクラスパス上にある別のjarファイルの「plugin.xml」を見つけたら、最初に「plugin.xml」が見つかりました。そして、そうではありません.... – buymypies

+0

あなたは1つ以上の瓶が関与していたことを忘れました。あなたの問題を読んで、それはあなたが単一の瓶の重複ファイルについて話しているように聞こえる。とにかく、両方のファイルが両方のjarファイル内で全く同じパスを持っていると仮定すると、ClassLoader.getResources( "path/in/both/jars")を使用すると、そのパスに一致するものを表すEnumerationを返すことができます。正しいものがどれかを判断する必要があります。それに失敗すると、この問題を解決するために独自のClassLoaderを実装する必要があります。 – Jon

答えて

0

は、私は絶対にわからないんだけど、あなたの問題を解決することがありThread.currentThread().getContextClassLoader().getResourceAsStream("/plugin.xml")のように思えます。そうでない場合は、自分自身でClassLoaderを作成し、問題を解決する必要があります。

URL myJar=JmxPlugin.class.getResource("/"+JmxPlugin.class.getName().replace(".","/")+".class"); 

は、その後に、このURLを使用します。

+0

ありがとう、しかし、iveはこれまで運がないとこれを試しました。 – buymypies

0

simpliesの方法は、最初に含むplugin.xmlのようにクラスパスにjarファイルを移動することで、 別のアプローチは、あなたのjarファイルを検索するのgetResource()を使用することですjarファイルを開き、Plugin.xmlを抽出します。

関連する問題