私のアプリケーションでは、次の方法でリソースをロードします。
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ではなく)1つのファイル名を取得し、次のように使用します。
System.setProperty("javax.net.ssl.trustStore", fileNameString)
FileInputStream
などを使用してリソースをロードしようとしているようです。しないでください:getResource
を呼び出す代わりに、 getResourceAsStream
を呼び出して、そこからデータを読み取ります。
(代わりにURLからリソースをロードすることもできますが、getResourceAsStream
を呼び出す方が少し便利です。)
編集:あなたの更新された答えを見て、コードの他のビットはファイルシステムの物理的な単一ファイルにあるデータに依存しているようです。したがって、答えはそもそもそれをjarファイルにバンドルしないことです。あなたはできましたそれが別のファイルにあるかどうかを確認し、それが一時ファイルに抽出されていない場合は、それはかなりハックなIMOです。
_Java -jar app.jar
_を使用してコードを実行する場合、Javaは、JARファイルのマニフェストで定義されたクラスパスのみを使用します(つまり、_Class-Path
_属性)。クラスが_app.jar
_、またはクラスがJARのマニフェストの_Class-Path
_属性で設定されたクラスパスにある場合、次のコードスニペットを使用してそのクラスをロードできます。ここで、className
は完全修飾ですクラス名。
_final String classAsPath = className.replace('.', '/') + ".class";
final InputStream input = ClassLoader.getSystemResourceAsStream( path/to/class );
_
クラスがJARの一部ではなく、マニフェストの_Class-Path
_にない場合、クラスローダーはそれを見つけません。代わりに、URLClassLoader
を使用できます。ただし、ウィンドウとUnix/Linux/MacOSXの違いに注意して対処してください。
_// 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 );
_
どちらの例でも、例外と、リソースが見つからない場合の入力ストリームがnull
であるという事実に対処する必要があります。また、InputStream
を_byte[]
_に入れる必要がある場合は、ApacheのコモンズIOUtils.toByteArray(...)
を使用できます。また、Class
が必要な場合は、クラスローダーのdefineClass(...)
メソッドを使用できます。このメソッドは、_byte[]
_を受け入れます。
このコードは、Diffusiveソースコードの ClassLoaderUtils
クラスにあります。SourceForgeのgithub.com/robphilipp/diffusiveにあります。
RestfulDiffuserManagerResource.createJarClassPath(...)
の相対パスと絶対パスからWindowsおよびUnix/Linux/MacOSXのURLを作成する方法
URL
を作成すると、 openStream
メソッドを使用して、リソースを(jarファイルでも)ロードできます。