2012-07-15 13 views
7

まず、私は多くのS.O.このトピックに関する質問と私はそれらで提案されたことを試してみました。コンパイル済みのjarのリソースへのアクセス方法は?

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

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

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

私はjarファイルをエクスポートし、それが内容だ検査するjarファイルをuzipとき、私はこれらのdirsの内容はトップレベルに投棄されていることがわかります.jarのこのようになります

.jar 
    packages 
    jar files 
    fonts 
    json files 

だから、私のようなもので、設定ファイルをロードしようとすると:私は、Eclipseでアプリを実行すると

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

すべてが単にファイルで動作します。しかし、jarファイルはFileNotFoundExceptionをスローします。

私がS.O.で見た多くの質問。これらの問題については、class.getClass().getResource()またはclass.getResourceAsStream()を使用してお勧めします。私は

java -jar myjarfile.jar 

を:使用してEclipseやjarファイルのいずれかから実行した場合、nullを返し

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

これらのメソッドのすべてを:私はのようにこれらの使用の相対パスとファイル名だけの両方を試してみましたAntファイルを使用することもできます。実際には、エクスポート機能で生成されたAntファイルを使用してjarを構築しています。何かがある場合は、それに追加することができます瓶には、ディレクトリも素晴らしいでしょう。

答えて

5

ルートにあるリソースにアクセスするには、パスに/を追加します。そうでない場合は、現在のパッケージに関連して行います。これは通常、リソースが物理的にソースのクラスの隣にある場合にのみ便利です。

したがって、class.getResourceAsStream("/config.json");を使用して、jarのルートでconfig.jsonにアクセスしてください。

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

+0

ご回答ありがとうございます。 getResource()に追加してスラッシュを使用することをお勧めしますか? – JeremyFromEarth

+0

これははるかに近づくようです。これは、これが返すパスです: jar:file:/ C:/path_to_project/myjarfile.jar!/config.jsonただし、jarファイルを実行すると、パスは正しくてもファイルは例外ではありません。また、Eclipse内で動作することについても言及する必要があります。 – JeremyFromEarth

+1

jars内のリソースでFileReaderを使用することはできません。 getResourceAsSTreamから返されたInputStreamを使用する必要があります。 –

1

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

あなたのパッケージ構造がある場合:ログイン

com.yourco.authentication 

そして、あなたのクラス次に、あなたのjarファイルは、あなたが、その後のenvのためにあなたのクラスパスに.jarファイルが必要

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

する必要がありますコマンドライン経由で実行します。

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

+0

/を参照するようにコードを編集することで他の提案が表示されます。テストすることなく動作する可能性がありますが、ディレクトリ構造を使ってアプリケーションではなくlibをパッケージ化しようとしているようです。 –