8

まず、このトピックに関する多くのSOの質問を読み、それらで提案されていることを試しました。

これが私の状況です。私はProcessingフレームワークを使用してJavaアプリを作成しており、アプリのパッケージ化について考える必要がある最終段階にあります。コマンドラインから実行可能なjarファイルは、Eclipseのエクスポート機能を使用してビルドしようとしているものです。

私のプロジェクトの構造は次のようになります。

src/
   multiple packages/
libs/
   jar files and natives
data/
   fonts and images
config/
   json files

jarファイルをエクスポートしてjarをuzipして内容を調べると、これらのdirの内容が.jarの最上位にダンプされていることがわかります。

これは次のようになります:

.jar
    packages
    jar files
    fonts
    json files

したがって、次のような構成ファイルをロードしようとすると、次のようになります。

BufferedReader reader = new BufferedReader( new FileReader( path ) );

Eclipseでアプリを実行すると、すべてがファイルだけで機能します。しかし、jarファイルは。をスローしFileNotFoundExceptionます。

class.getClass().getResource()これらのような問題に関してSOで見た質問の多くは、またはを使用することをお勧めしclass.getResourceAsStream()ます。次のように、相対パスとファイル名だけを使用して、これらの両方を試しました。

class.getResource( 'config.json' );
class.getResources( 'cfg/config.json' );
class.getResourceAsStream( '../../config.json' );

以下を使用してEclipseまたはjarから実行すると、これらのメソッドはすべてnullを返します。

java -jar myjarfile.jar

Antファイルを使用することもできます。実際、私は現在、エクスポート機能によって生成されたAntファイルを使用してjarをビルドしています。それに追加できるものがあれば、ディレクトリをjarに追加することもできます。

4

2 に答える 2

5

ルートのリソースにアクセスするには/、パスの先頭に a を追加します。そうでない場合は、現在のパッケージに対して相対的に行います。これは通常、リソースがソース内のクラスの隣に物理的にある場合にのみ役立ちます。

したがってclass.getResourceAsStream("/config.json");、jar のルートにある config.json に到達するために使用します。

また、jars-inside-jars は直接サポートされていないことに注意してください。

于 2012-07-15T22:10:13.867 に答える
1

.jar ファイルには、コンパイルされたコードの「パッケージ」に関連するディレクトリのみを含める必要があります。/lib /WEB-INF などで .war 構造を参照している可能性がありますが、これは異なります。

パッケージ構造が次の場合:

 com.yourco.authentication

そしてログインのあなたのクラス

次に、あなたの瓶は

/com/
  /yourco/
    /authentication/
        Login.class

次に、env をコマンド ライン経由で実行するには、クラスパスに .jar が必要です。

環境設定やインポートされた必要なライブラリなどが含まれている可能性が高いEclipseで動作することに注意してください。正確に伝えるのは難しいです。packages/ フォルダーにコンパイル済みの Java コードが含まれている場合、外部から参照したときにそれが機能するかどうかわからないため、ルート フォルダーでパッケージを開始することをお勧めします。

于 2012-07-15T22:12:01.650 に答える