2016-09-05 8 views
2

でアプリケーションのリソース内に格納されているJARをロードするためにはどうすればURLClassLoaderでJARファイルをロードしようとしています。このJARファイルは、私のプロジェクトのリソースに保存されている、と私はMavenを使って自分のプロジェクトを実行しているときには、次のコードで正常に動作している:URLClassLoaderの

しかし
new URLClassLoader(
    new URL[]{MyClass.class.getClassLoader().getResource("dependencies/dependency.jar")}, 
    ClassLoader.getSystemClassLoader().getParent() 
); 

、私はmvn clean installを使用してプロジェクトを構築し、私は、しようとすると、 java -jar myapp.jarを使用して生成JARを実行すると、dependency.jarがロードされていないようです。 dependency.jarファイルは、プロジェクトJAR内のdependencies/dependency.jarに正しく保存されていますが、読み取られません。

私はそれがJARファイル内からロードすることができないことを前提としていますが、その回避策ですか?

私は解決策がgetResourceAsStreamを使用することだと思うが、私は、URLの中に、このストリームを変換する必要があります。

可能であれば、私はdependency.jarの内容を保存するために作成した一時ファイルを伴わないだろうソリューションを使用したいと思います。

+0

dependency.jarはjarファイルにありますか?もしそうなら正確に?それは '依存関係/ dependency.jar' –

+0

はい、それは、私のプロジェクトからのリソースには? – AntoineB

+0

に位置して構築されたJARに代わりにしようとしたMyClass.class.getResource(「/依存関係/ dependency.jar」)を持っているので –

答えて

1

私はあなたの問題が原因あなたは一時ファイルにあなたのjarファイルをコピーして、次のようにあなたのURLClassLoaderにこの一時ファイルを用意する必要があるので、それは、ジップでzipファイルを読み込むことができませんという事実にあると信じている:

// Get the URL of my jar file 
URL url = MyClass.class.getResource("/dependencies/dependency.jar"); 
// Create my temporary file 
Path path = Files.createTempFile("dependency", "jar"); 
// Delete the file on exit 
path.toFile().deleteOnExit(); 
// Copy the content of my jar into the temporary file 
try (InputStream is = url.openStream()) { 
    Files.copy(is, path, StandardCopyOption.REPLACE_EXISTING); 
} 
// Create my CL with this new URL 
URLClassLoader myCL = new URLClassLoader(
    new URL[]{path.toUri().toURL()}, ClassLoader.getSystemClassLoader().getParent() 
); 
+0

ええ、私はそれが私がやらなければならないことに恐れています、ありがとう。私はちょうど別の解決策があるかどうか調べたいと思っていました。 – AntoineB

+0

Files.createTempFileは同じファイルを2回作成することは想定されていないので、StandardCopyOption.REPLACE_EXISTINGが必要であるかどうかはわかりません。追加しないと問題に直面しますか? –

+0

'Files.copy'はファイルを作成しようとします。ドキュメントにも書かれています: "デフォルトでは、ターゲットファイルがすでに存在するかシンボリックリンクであれば、コピーは失敗します。"編集提案については – AntoineB

関連する問題