1

いくつかのJavaファイル、いくつかの画像を含む画像フォルダー、およびいくつかのテキストファイルを含むデータフォルダーで構成されるプロジェクトを作成しました。プログラムをコンパイルしてターミナルで実行すると、すべてが完全に機能します。私はそれをjarファイルに変換しようと決心したので、マニフェストファイルを使用するなど、多くの調査の結果、なんとか実行できました。これが私がそれをするためにターミナルにタイプするものです:

jar cvfm Program.jar manifest.txt *.class images data  

この出力を与える:

added manifest  
adding: a.class (in = 500) (out = 500) (deflated 50%)  
adding: b.class (in = 500) (out = 500) (deflated 50%)  
adding: images/ (in = 0) (out = 0) (stored 0%)  
adding: images/a.png (in = 500) (out = 500) (deflated 50%)  
adding: images/b.png (in = 500) (out = 500) (deflated 50%)  
adding: data/ (in = 0) (out = 0) (stored 0%)  
adding: data/a.txt (in = 500) (out = 500) (deflated 50%)  

目立つのは、in、out、stored=0のimages/とdata/だけです。

これは機能し、jarファイル内のすべてのファイルを正しくリストします。jarファイルは、プログラムの正しいディレクトリにある場合でも完全に実行されますが、そのディレクトリから削除すると、リソースファイル(画像とデータ)が見つからなくなり、理由がわかりません。コードでそれらを参照している方法や、リソースファイルが適切に添付されていない方法である可能性がありますが、よくわかりません。私のマニフェストファイルは次のもので構成されています。

Manifest-Version: 1.0  
Main-Class: Strike

どんな助けでもいただければ幸いです。

4

2 に答える 2

3

クラスパスに問題があります。プロジェクトディレクトリでJARを起動すると、実際には、アーカイブからではなく、ファイルシステムからリソースを読み取っています。

クラスパスからリソースを読み取るには、Class.getResourceAsStream(String)

InputStream in = getClass().getResourceAsStream("/images/foo.png");

そして、あなたがすでに行っているように、最終的なアーカイブfoo.pngのディレクトリ内に置きます。imagesの先頭のスラッシュに注意してください/images/foo.png。ドキュメントを引用する

絶対リソース名は、次のアルゴリズムを使用して、指定されたリソース名から作成されます。

  1. 名前が「/」(「\ u002f」)で始まる場合、リソースの絶対名は「/」に続く名前の部分です。

  2. それ以外の場合、絶対名は次の形式になります。modified_package_name/name ここで、modified_package_nameはこのオブジェクトのパッケージ名であり、「。」の代わりに「/」が使用されます。('\ u002e')。

IDEを使用してプロジェクトをビルドしたくない場合は、AntMavenなどのツールがあります。

于 2012-08-23T12:00:22.950 に答える
3

リソース ファイル (画像など) が jar ファイルに保存されている場合は、次のようにしてアクセスする必要があります。

inputstream = getClass()
              .getClassLoader()
              .getResourceAsStream("Path to your file in the jar file");
于 2012-08-23T11:56:14.810 に答える