Java アプリケーションがあり、JAR ファイルを作成してデプロイしました。
アプリは、Log4J JAR などの外部 JAR を使用します。JAR ファイルを作成するときに、すべての外部依存 JAR をアーカイブに含めるにはどうすればよいですか?
アプリを機能させるには、Log4J JAR を自分の JAR と同じディレクトリにコピーする必要があります。これは、jar の目的を少し無効にします。単一の JAR ファイルをデプロイする方がエレガントではないでしょうか?
Java アプリケーションがあり、JAR ファイルを作成してデプロイしました。
アプリは、Log4J JAR などの外部 JAR を使用します。JAR ファイルを作成するときに、すべての外部依存 JAR をアーカイブに含めるにはどうすればよいですか?
アプリを機能させるには、Log4J JAR を自分の JAR と同じディレクトリにコピーする必要があります。これは、jar の目的を少し無効にします。単一の JAR ファイルをデプロイする方がエレガントではないでしょうか?
Eclipseを使用している場合は、次のように、含まれているすべてのファイルを1つの実行可能なjarに抽出できます。
依存関係jarを個別のjarファイルとしてパッケージ化するか、生成されたJARに抽出するかを選択できます。
One-JAR のようなものを使用して、Java アプリケーションとその依存関係を単一の実行可能な Jar ファイルにパッケージ化できます (One-JAR はカスタム クラスローダーを使用して、JAR のネストを可能にします)。
特定の JAR のみを新しいバージョンに簡単にアップグレードできるため、JAR を個別に保持することをお勧めします。他の構成には影響しません。各ファイルを JAR と同じ場所にコピーする必要があるという問題があるため、いつでも JavaCLASSPATH
を使用して、任意の JAR をアプリケーションのクラス パスに含めることができます。
ライブラリ jar をコンパイル済みのクラスと同じ場所に展開し、そこから jar を作成する必要があります。ビルド プロセスの設定方法によっては、これを実現する方法が複数ある場合があります。これはロケット科学ではありません。jar は、ルート レベルに META-INF ディレクトリを持つ単なる zip アーカイブです。
Maven + アセンブリ プラグインを使用できます ( http://maven.apache.org/plugins/maven-assembly-plugin/ )
ところで、Maven を使用していない場合、これはおそらく最も簡単な方法ではありません。
あなたが発見したように、JAR自体は他のJARをネストすることはできません。
従来は、アプリケーション JAR (自分のもの) とサポート JAR をクラスパス アクセス用の適切な場所に展開する ZIP アーカイブまたはその他のインストーラーを配布していました。その後、多くの場合、アプリケーションは、プライマリ JAR を呼び出し、サポート JAR をリストするクラスパスを作成するスクリプトを介して呼び出されました。
他の投稿者が指摘しているように、必要に応じてスーパー JAR を作成するオプションがいくつかあります。