回答:
アプリケーションと必要なライブラリーを含む単一のjarを作成しようとしている場合、それを行うには2つの方法(私が知っている)があります。1 つはOne-Jarで、特別なクラスローダーを使用してjarのネストを可能にします。もう1つはUberJar(またはShade)で、含まれているライブラリを分解し、すべてのクラスを最上位のjarに入れます。
また、UberJarとShadeはそれぞれMaven1とMaven2のプラグインであることにも触れておきます。以下で説明するように、アセンブリプラグインを使用することもできます(実際には非常に強力ですが、適切に構成するのははるかに困難です)。
これらの「JARコンテンツの分解」ソリューションを使用したくない。彼らは間違いなくものを見るのを難しくします(すべてが同じレベルで分解されるので)。さらに、名前の競合が発生する可能性があります(適切なパッケージを使用している場合は発生しないはずですが、これを常に制御できるわけではありません)。
あなたが望むことを特徴としての一つであるトップ25日のRFE:RFE 4648386、Sunは、その無限の知恵で、優先度が低いものとして指定しています。私たちは太陽が目を覚ますことを望みます...
その間、私が遭遇した最良の解決策(SunがJDKにコピーすることを望む)は、カスタムクラスローダーJarClassLoaderを使用することです。
activation.jar
)。
いくつかの調査の結果、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
は、ファイルv
を詳細な入力用
に指定
m
することを意味し、カスタムマニフェストファイルを渡すことを意味します。
jarパッケージにlibが含まれていることを確認してください。jarを通常の方法で実行できるはずです。
ベース:http : //www.ibm.com/developerworks/library/j-5things6/
クラスパスについて必要な他のすべての情報はここにありますか
custom_lib.jar
離れてしまうと、jarはもう実行できません:(
使用zipgroupfilesetタグ(用途と同じ属性ファイルセットタグ)。ディレクトリ内のすべてのファイルを解凍し、新しいアーカイブファイルに追加します。詳細:http : //ant.apache.org/manual/Tasks/zip.html
これはjar-in-a-jarの問題を回避するのに非常に便利な方法です-何をすべきかを理解しようとしているときにこの正確なStackOverflowの質問をググったので知っています。jarまたはjarのフォルダーをAntで作成した1つのjarにパッケージ化したい場合は、このクラスパスやサードパーティのプラグインのことをすべて忘れて、これを(Antで)行うだけです。
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
antを使用してビルドしている場合(私はeclipseのantを使用しています)、antに追加するように言って、追加のjarファイルを追加できます...複数の人がプロジェクトを管理しているが、それが機能する場合は、必ずしも最良の方法とは限りません一人のプロジェクトのために、簡単です。
たとえば、.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ファイルのあるdirでした。以上です...
これを行うには、カスタムクラスローダー、またはこれをサポートするサードパーティライブラリをビルドする必要があります。最善の策は、jarをランタイムから抽出してクラスパスに追加することです(またはクラスパスにすでに追加しておくこと)。
Mavenアセンブリプラグインと呼ばれるプラグインを持つJavaビルドにMavenを使用します。。
それはあなたが求めていることを行いますが、他のいくつかの提案が説明しているように-依存するすべてのjarを本質的に分解し、それらを単一のjarに再結合します
Winstoneはかなり良いhttp://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/です。ただし、複雑なサイトは対象外です。プラグインをインクルードするだけなので、それは残念です。
まあ、Eclipseを使用している場合は非常に簡単な方法があります。
プロジェクトを「実行可能な」Jarファイルとしてエクスポートします(Eclipse内からプロジェクトフォルダーを右クリックし、[エクスポート...]を選択します)。エクスポート設定を構成するときは、[必要なライブラリを生成されたJARに抽出する]を選択してください。「Package required libraries ...」ではなく、「Extract ...」を選択してください。
さらに:エクスポート設定で実行構成を選択する必要があります。したがって、常にいくつかのクラスで空のmain()を作成し、それを実行構成に使用できます。
とにかく、それは保証されていません 100%の時間で動作れ。含めるJarファイルのライセンスを確認し、署名ファイルをコピーしないことを確認するように指示するポップアップメッセージが表示されます。しかし、私はこれを何年も行っており、問題に遭遇したことがありません。
Uber-dirへの抽出は、すべてroot:\ javaを使用し、バージョニング付きのパッケージにアウトレットコードがあるため、私にとってはうまくいきます。つまり、ca.tecreations-1.0.0です。jarはダウンロードした場所からそのままなので、署名は問題ありません。サードパーティの署名はそのままで、c:\ javaに抽出します。私のプロジェクトディレクトリがあります。ランチャーから実行するので、java -cp c:\ java Launcher