ロード私は、このようにリソースをロードする私のアプリケーションのJAR


21

に含まれるリソース:

WinProcessor.class.getResource("repository").toString(); 

、これは私を与える:

file:/root/app/repository (and I replace "file:" with empty string) 

私はIDEから自分のアプリケーションを実行したときにこれが正常に動作します私は自分のアプリケーションのjarファイルを実行すると、しかし:

java -jar app.jar 

パスは次のようになります。

jar:/root/app.jar!/repository 

この問題を解決する方法はありますか?私はこれを作成するために、「リポジトリ」ディレクトリ名を使用します

:同様に

ConfigurationContext ctx = (ConfigurationContext) ConfigurationContextFactory.createConfigurationContextFromFileSystem(repositoryString, null); 

を、私は(代わりにDIRの)一つのファイル名を取得しますし、私が使用しますそれこの方法:

System.setProperty("javax.net.ssl.trustStore", fileNameString) 
35

FileInputStreamなどを使用してリソースをロードしようとしているようです。しないでください:getResourceを呼び出すのではなく、getResourceAsStreamと呼んで、そこからデータを読んでください。

(あなたが代わりにURLからリソースをロードしますが、getResourceAsStreamを呼び出すと、もう少し便利である可能性があります。)

EDIT:あなたの更新の答えを見た、コードの他のビットは、データがであることに依存しているようですファイルシステム内の物理的な単一ファイル。その答えは、最初にjarファイルにバンドルすることではありません。あなたはそれが別のファイルにあるかどうかをチェックし、それが一時ファイルに抽出されない場合、それはかなりハッキーなIMOです。

+1

同意します。物理的な単一ファイル(Java Web Start for one)を扱うことが100%確実であると言うことができないときは、常にストリームでコードする必要があります。 22 2月. 092009-02-22 12:16:38


5

URLを構築し、あなたがしてopenStreamメソッドを使用して(でも、jarファイル内の)リソースをロードすることができます。

+1

これは、 'getResourceAsStream'がするものです。 12 7月. 162016-07-12 14:20:56


9

java -jar app.jarを使用してコードを実行すると、javaはJARファイルのマニフェストで定義されたクラスパス(つまり、Class-Path属性)のみを使用します。クラスがapp.jarの場合、またはクラスがJARのマニフェストのClass-Path属性に設定されているクラスパスにある場合は、次のコードスニペットを使用してそのクラスをロードできます。classNameは完全修飾クラス名です。クラスは、JARの一部ではなく、それはマニフェストのClass-Pathにない場合

final String classAsPath = className.replace('.', '/') + ".class"; 
final InputStream input = ClassLoader.getSystemResourceAsStream(path/to/class); 

さて、その後、クラスローダはそれを見つけることができません。その代わりに、URLClassLoaderを使用して、WindowsとUnix/Linux/MacOSXの違いに注意してください。あなたは例外、およびリソースが見つからない場合は、入力ストリームがnullであるという事実に対処する必要がありますどちらの例で

// the class to load 
final String classAsPath = className.replace('.', '/') + ".class"; 

// the URL to the `app.jar` file (Windows and Unix/Linux/MacOSX below) 
final URL url = new URL("file", null, "///C:/Users/diffusive/app.jar"); 
//final URL url = new URL("file", null, "/Users/diffusive/app.jar"); 

// create the class loader with the JAR file 
final URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url }); 

// grab the resource, through, this time from the `URLClassLoader` object 
// rather than from the `ClassLoader` class 
final InputStream input = urlClassLoader.getResourceAsStream(classAsPath); 

。また、InputStreambyte[]にする必要がある場合は、ApacheのコモンIOUtils.toByteArray(...)を使用できます。 Classが必要な場合は、クラスローダーのdefineClass(...)メソッドを使用できます。これはbyte[]を受け入れます。

あなたがWindowsとUnix/Linux用のURLを作成するためにgithub.com/robphilipp/diffusive

そして方法でSourceForgeで見つけることができる拡散性のソースコードにClassLoaderUtilsクラスでこのコードを見つけることができます

/相対パスと絶対パスからのMacOSX RestfulDiffuserManagerResource.createJarClassPath(...)