2

私の問題は次のとおりです。Jar内のクラスファイルにアクセスしようとしています。パッケージ「com.msgxsd」にjar「dumb.jar」があります。jarファイルはクラスパス上にあります。

InputStream is = this.getClass().getClassLoader()
            .getResourceAsStream("com/msgxsd/dumb.jar");

次に、問題なくjarの入力ストリームを取得します。

jar内のファイルの入力ストリーム(またはURL)を取得しようとすると、問題が発生します。(マニフェストを除いて)jarに含まれているのは、ファイル「DummyClass1.class」だけです。

私は次のすべてを試しました:

InputStream is = this.getClass().getClassLoader() .getResourceAsStream("DummyClass1.class");

InputStream is = this.getClass().getClassLoader() .getResourceAsStream("dumb.jar!/DummyClass1.class");

ただし、返される入力ストリームは常にnullです。私も試しました

URL url = this.getClass().getResource("DummyClass1.class");
URL url = this.getClass().getResource("dumb.jar!/DummyClass1.class");

ただし、返されるURLはnullです。

Jar内のファイルへのアクセスに関連する質問のすべてをすでに見てきましたが、提案された解決策(上記のように)は私には機能しません。

私が欲しいのは、jar内の「DummyClass1.class」のInputStream(または理想的にはURL)のいずれかを取得できるようにすることです。これにより、何らかの方法でFileインスタンスを構築できます。

任意の提案をいただければ幸いです。

4

5 に答える 5

2

試す

InputStream is = this.getClass().getClassLoader().getResourceAsStream("dumb.jar/DummyClass1.class"); 

多分jar内のDummyClass1.classの場所を指定します

于 2012-05-15T14:12:39.637 に答える
1

これを試してみてください(タイプミスがある場合は申し訳ありませんが、試さずに頭のてっぺんからコードを入力しているだけです):

int index = path.indexOf('!');
if (index == -1) return url.openStream();
String jarPath = path.substring(0, index);
File jarFile = new File(new URL(jarPath).toURI());

if (!jarFile.exists()) return null;

String filePath = path.substring(index + 1);
if (filePath.startsWith("/")) {
    filePath = filePath.substring(1);
}

JarFile jar = new JarFile(jarFile);
return jar.getInputStream(jar.getJarEntry(filePath));
于 2012-05-15T14:12:20.823 に答える
1

試す

is = this.getClass().getClassLoader().getResourceAsStream("com/msgxsd/dumb.jar!/DummyClass1.class")
于 2012-05-15T14:19:42.663 に答える
1

私がすることはJarInputStream、jarファイルの内容に直接アクセスするためにを使用することです。JarEntry次に、探しているファイルが見つかるまでコレクションを繰り返し処理し、ストリームから読み取ります。このようなもの:

JarInputStream jarIn = new JarInputStream(this.getClass().getClassLoader() .getResourceAsStream("com/msgxsd/dumb.jar"));  
JarEntry entry = jarIn.getNextJarEntry();

jarIn次に、 readメソッドを使用してファイルを読み取ります。

于 2012-05-15T14:22:32.583 に答える
1

最も簡単な方法は、jarを移動してクラスパスに直接含まれるようにするか、クラスパスを変更して「com/msgxsd」をトップレベルのエントリとして含めることです。これらのいずれの場合もDummyClass、標準によってロードされ、すでに提案したようにClassLoader簡単に実行できます。getResourceAsStream("DummyClass1.class")

この方法でクラスパスを変更できない場合は、JarInputStream上記の@Mickyまたはこのより完全な回答で提案されているようにを作成する必要があります。

于 2012-05-15T15:39:31.250 に答える