classpath
別の JAR ファイルに含まれる JAR ファイルを含むJava を指定することはできますか?
14 に答える
アプリケーションとそれに必要なライブラリを含む単一の jar を作成しようとしている場合、(私が知っている) 2 つの方法があります。1 つ目はOne-Jarで、特別なクラスローダーを使用して jar のネストを可能にします。2 つ目はUberJar (またはShade ) で、含まれているライブラリを展開し、すべてのクラスを最上位の jar に配置します。
また、UberJar と Shade はそれぞれ Maven1 と Maven2 のプラグインであることにも言及する必要があります。以下で説明するように、アセンブリ プラグインを使用することもできます (実際にはアセンブリ プラグインの方がはるかに強力ですが、適切に構成するのははるかに困難です)。
これらの「JAR コンテンツを展開する」ソリューションは使用したくありません。それらは間違いなく物を見るのを難しくします (すべてが同じレベルで分解されるため)。さらに、名前の競合が発生する可能性があります (人々が適切なパッケージを使用している場合は発生しないはずですが、常にこれを制御できるわけではありません)。
必要な機能は、Sun の RFE の上位 25のうちの 1 つです: RFE 4648386であり、Sun は無限の知恵により、優先度が低いと指定しています。太陽が目を覚ますことを願うばかりです...
その間、私が見つけた最善の解決策 (Sun が JDK にコピーしてくれることを願っています) は、カスタム クラス ローダーJarClassLoaderを使用することです。
いくつかの調査の後、Mavenやサードパーティの拡張機能/プログラムを必要としない方法を見つけました。
マニフェスト ファイルで「Class-Path」を使用できます。
例えば:
マニフェスト ファイル MANIFEST.MF を作成します。
Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass
すべてのクラスをコンパイルして実行しますjar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
create archive の略で、
f
file を指定することを示します
v
。詳細入力用
です。これは、m
カスタム マニフェスト ファイルを渡すことを意味します。
jar パッケージに lib が含まれていることを確認してください。通常の方法で jar を実行できるはずです。
基づく: http://www.ibm.com/developerworks/library/j-5things6/
クラスパスについて必要な他のすべての情報はここにありますか
zipgroupfilesetタグを使用します ( filesetタグと同じ属性を使用します)。ディレクトリ内のすべてのファイルを解凍し、新しいアーカイブ ファイルに追加します。詳細: http://ant.apache.org/manual/Tasks/zip.html
これは、jar-in-a-jar 問題を回避するための非常に便利な方法です。jar または jar のフォルダーを Ant でビルドされた 1 つの jar にパッケージ化する場合は、このクラスパスまたはサードパーティのプラグインのことはすべて忘れてください。必要なのは次のことだけです (Ant で):
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
ant で構築している場合 (私は eclipse の ant を使用しています)、追加の jar ファイルを追加するように ant に指示するだけで済みます。一人のプロジェクトのため、簡単です。
たとえば、.jar ファイルを作成していたターゲットは次のとおりです。
<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
<manifest>
<attribute name="Author" value="ntg"/>
................................
<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
</manifest>
</jar>
私はそれを作るために1行追加しました:
<jar ....">
<zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
<manifest>
................................
</manifest>
</jar>
どこ
<property name="external-lib-dir"
value="C:\...\eclipseWorkspace\Filter\external\...\lib" />
外部jarのあるディレクトリでした。以上です...
独自のクラス ローダーを作成する必要はありません。jar を jar のクラスパスに追加できますが、メインの jar に含まれるのではなく、同じ場所に配置する必要があります。
これを行うには、カスタム クラスローダーを構築するか、これをサポートするサードパーティ ライブラリを構築する必要があります。最善の策は、ランタイムから jar を抽出し、それらをクラスパスに追加することです (または既にクラスパスに追加しています)。
私は、maven assembly pluginというプラグインを持つ Java ビルドに maven を使用しています。
それはあなたが求めていることを行いますが、他の提案のいくつかが説明しているように、基本的にすべての依存ジャーを分解し、それらを単一のジャーに再結合します
Winstone はとても良いhttp://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/です。ただし、複雑なサイトではありません。必要なのはプラグインを含めることだけなので、それは残念です.
Eclipse を使用している場合は、非常に簡単な方法があります。
プロジェクトを「実行可能な」Jar ファイルとしてエクスポートします (Eclipse 内でプロジェクト フォルダーを右クリックし、「エクスポート...」を選択します)。エクスポート設定を構成するときは、必ず「必要なライブラリーを生成された Jar に抽出する」を選択してください。「パッケージに必要なライブラリ...」ではなく、「抽出...」を選択することに注意してください。
さらに: エクスポート設定で実行構成を選択する必要があります。そのため、いつでも一部のクラスで空の main( ) を作成し、それを実行構成に使用できます。
いずれにせよ、 100% の確率で動作する保証はありません。含まれている Jar ファイルのライセンスを確認するようにというポップアップ メッセージが表示され、署名ファイルをコピーしないようにというメッセージが表示されるからです。ただし、私はこれを何年も行っており、問題に遭遇したことはありません。
すべてのファイルを同じレベルで抽出し、その結果から jar を作成するようにアドバイスしようとしていました。パッケージ システムではファイルをきちんと分離しておく必要があるからです。それは手動の方法ですが、スティーブが示したツールがうまくいくと思います。