2011-11-28 7 views
5

私はファイル(画像、サウンドなど)や複数のjar依存関係のいくつかの異なるタイプで構成されたJavaプロジェクトを持っている場合は、1本の瓶にそれをすべてをパッケージ化するための良い方法は何でありますちょうどダブルクリックすることができますか?シングルのjar javaアプリケーションを作る

私はジャンパーは自分たちが依存しているファイルでは見えないという点でかなり愚かであることを知っています(私はほんの少しの欲求不満(控えめな表現)の後でしか実現しませんでした)。 - jar Aがjar Bの内部に含まれるクラスに依存する場合、jar Bをjar Aの中に入れることはできません。ジャーAがジャーB.

と同じディレクトリにある必要があります...今、私はちょうど他のすべてのjarファイルからすべてのファイルを抽出し、同じディレクトリにすべてをかける可能性が知っています。そのとなりますが、私はそれをしたくありません:1.それは面倒です2.それは最終的に同じディレクトリにサウンドファイルを持つ必要性の問題を解決しません瓶。 (何らかの理由で、サウンドファイルは内部ジャーと全く同じように動作します)

基本的には、私のアプリケーションが依存しているファイルが邪魔にならないようにしたいのです。だから、すべてのものをjarファイルの中に入れて、それがプログラム全体を実行するのに必要なファイルになるような解決策があれば、それは最適なものになります。しかし、私は、親ディレクトリにバッチスクリプトを使ってjarや何かを実行させるなど、問題を回避する創造的/進歩的な方法を受け入れることを望んでいます。 (その正確なシナリオは、Windowsオペレーティングシステムでのみ動作しますので、私が言う「か何か」。...あなたは私が何を意味するか知っている!)

+0

どのようにあなたがアクセスしているあなたのリソース(などのサウンドファイル)?ファイルとしてまたはgetResource()として? –

+0

Fileオブジェクトにファイル名を渡しています – Pojo

答えて

2

あなたはすべてのJARを抽出し、一つの共通JARにそれらをマージすることができます。 ANTタスクとMavenプラグインは、これを行うためにすぐに利用できます。さらに、アプリケーションが正しく書かれている場合は、JARにメディアファイルやその他のリソースを置くことを妨げるものは何もありません。現在の作業ディレクトリからロードされるのではなく、これらのリソースが "loaded from the classpath"であることを確認するだけです。

+0

どうすれば "クラスパスからロード"するのでしょうか?私はサウンドを再生する2つの方法を使用しています。 1つはjmfで、サウンドファイルをURLオブジェクトとして受け取ります.1つはClipで、サウンドファイルをFileオブジェクトとして受け入れます。 – Pojo

+0

絶対のパッケージ/クラス名を含めることはできますか? javax.sound.sampled.Clipは、open(AudioInputStream stream)メソッドを提供します。このメソッドは、getResourceAsStream()で提供されるような通常のInputStreamを使用してインスタンス化できます。 – ziesemer

+0

まあ、絶対パス名を使用しないのはかなり悪いですか?あなたがしなければならないことは、瓶をどこか別の場所に移すことです。そして、突然それはもう働きません。 ...そして確かに、Clipはこれを行うことができるので、今すぐ試してみると思いますが、jmfを使用すると、javax.media.ManagerはDataSources、MediaLocators、およびURLからPlayerを作成することができます。そのことについて何? – Pojo

1

あなたはMavenのためのアセンブリのプラグインを使用している場合、あなたはそれが、依存関係をダウンロードするモジュールをビルドして実行可能なjarファイルを生成することができます。

1

実行可能なjarをビルドし、クラスパスで使用する必要がある他のjarファイルがある場合は、jarのMANIFEST.MFファイルに次のようなClass-Path:行があります。メインクラスの実行時にクラスパスに含めるエントリ(jarおよびディレクトリを含む)をリストします。

私は通常、そのような実行可能なjarをビルドし、Class-Path:ヘッダを設定するために私のIDEまたはantを使用します。ところで

、あなたのjarファイルを実行可能にするためには、メインクラスを設定します。あなたのMANIFEST.MFファイル内の行を。ここで

は私が構築し、実行可能jarファイルからの例です:あなたが構築するために蟻のようなツールを使用する場合

<target name="exejar"> 
    <jar destfile="myapp.jar" 
     basedir="bin" 
     include="**/app/*.class"> 
    <manifest> 
     <attribute name="Main-Class" value="com.example.app.MyAppCLI"/> 
     <attribute name="Class-Path" value="log4j.jar driver.jar libraries.jar"/> 
    </manifest> 
    </jar> 
</target> 

Main-Class: com.example.app.MyAppCLI 
Class-Path: log4j.jar driver.jar libraries.jar 

そして、ここではこれを構築するために、対応するAntターゲットでありますあなたの実行可能なjarファイルは、プロセスをより簡単に繰り返すことができます。また、MANIFEST.MFのヘッダ行が長くなり過ぎるときに起こるような、あなたのための妙なエッジケースを処理します。あなたはMavenを使用する場合は

0

、あなたはonejar-maven-pluginを理解し得ます。主な利点の1つは、すべての依存関係のjarファイルがjarファイルに保存され、コードがjarファイル内にあることです。これらのjarファイルはすべて、より大きなjarファイルに格納され、実行可能になり、潜在的なクラスパスの問題を回避します。詳細については、usage guideblog postをお読みください。

0

複数の種類のファイル(ピクチャ、サウンドなど)と複数のjarの依存関係からなるjavaプロジェクトがあります。ダブルクリックするだけの単一のjarファイルにすべてをパッケージ化するための良い方法は何ですか

リッチクライアントアプリケーションを配備するためのより良い方法。 Java Web Startを使用しています。エンドユーザはJarを見ることはなく、デスクトップショートカットやメニューアイテムを提供してアプリを起動できます。

関連する問題