0

そこで、私はJavaアプリケーションに取り組んでおり、リソースをjarファイルにパッケージ化して移植性を高めたいと考えています。これらのjarファイルはアプリケーションとは別のものであり、アセット(画像、サウンド、保存ファイルなど)のみが含まれます。

このようなjarファイル内から任意のリソースにアクセスする最も簡単な方法は何ですか?私は少し見回しましたが、簡単なチュートリアルを見つけることができませんでした。ClassLoaderを使用してJarファイルから入力ストリームを取得できることは知っていますが、正しいJarを参照するClassLoaderを取得するにはどうすればよいですか?

また、このようなjarファイルに大量のリソースをプログラムでバンドルするにはどうすればよいですか?これを思い通りに機能させることができれば、たくさんの用途に使用したいと思います。また、必要なアーカイブを動的に作成できるようにしたいと思います。

4

3 に答える 3

2

リソースを読み取るには、ロード元の JAR の URL を使用して新しいURLClassLoaderを作成します。

File jarFile1 = new File("myjar.jar");
File jarFile2 = new File("myjar2.jar");
ClassLoader myJarLoader = URLClassLoader.newInstance(new URL[] {jarFile1.toURI().toURL(), 
                                                                jarFile2.toURI().toURL()});

JAR ファイルの作成には、 JarOutputStreamクラスを使用できます。

于 2012-06-15T04:15:07.863 に答える
0

getResourceAsStreamリソースを含む jar がアプリケーションのクラスパスにある場合、リソース パッケージ パスを使用しても問題はありません。

バイナリから resource.jar を自動的に作成する方法は、ビルドにapache antを使用することです。次のようなターゲットを使用して、すべてのresパッケージ リソースを取得し、それを宛先 jar にコピーします。

<property name="binDir" value="bin" />
...

<target name="resources-jar">
    <echo message="Generating resources.jar" />
    <jar compress="true" destfile="resources.jar" filesetmanifest="mergewithoutmain">
        <fileset defaultexcludes="true" dir="${binDir}"> 
            <include name="**/res/**" />              
        </fileset>
    </jar>
</target>  

たとえば、次のパッケージが原因です

 com/myapp/logic 
 com/myapp/logic/res
 com/myapp/menu
 com/myapp/menu/res 
 com/myapp/actions
 com/myapp/actions/res

resource.jarファイルには次のパッケージが含まれます。

 com/myapp/logic/res
 com/myapp/menu/res 
 com/myapp/actions/res

また、あなたはresのために変更することができますassets

于 2012-06-15T04:09:31.687 に答える
0

I jar ファイルはクラスパスにあります Thread.currentThread().getContextClassLoader().getResourceAsStream(path/file.ext) は名前でリソースをロードします。

jar -cvf jarname.jar リソース

すべてのリソースを jarname.jar に追加します。ZipOutputStream を使用して、プログラムで同じことを達成してみてください。

于 2012-06-15T04:13:56.807 に答える