2012-01-24 4 views
8

私はantを使ってjava jarファイルをビルドしています。 "zipfileset src =" xxx.jar "" zipfileset src = "yyy.jar"とxxx.jarとyyy.jarの両方にSAMEの完全修飾クラス名を持つクラスがある場合、追加のjarファイルを含める必要があります。その結果生成されたjarファイルにはクラス名が重複しています。重複を持つ可能性のある意味は何ですか?Java JARに重複するクラスがあることの意味は何ですか?

ありがとうございます。

+0

は、なぜあなたはそれを行うにしたいん重複したエントリを持っていると文句を言うだろうsignjarそれをのAPKことです? – Bhushan

答えて

15

の場合、の実装では、何もロードされていません。–はロードされません。

ない場合は、クラスのロード順序のなすがままにしている、とあなたが欲しいとは異なるバージョンを得ることができます。

であり、クラスパスのエントリは(this classpath docのように)リストされた順序で検索されることが指定されています。これは、クラスパス作成を完全に制御している場合(たとえば、Webアプリケーションとは異なります)にのみ関係します。

私はデイブに同意

+0

はい、正確に重複した実装があります。ありがとうございます。私は見る。 –

0

(クラスパスワイルドカードは、非決定論的順序を作ること。警告付き)。

あなたは、彼が示唆落とし穴を避けるために、名前空間によってそれらを分離することはできますか?

4

一般的には、このsituatioinは非常に非 をお勧めしますし、避けるべきです。

JavaのJarsは、クラスファイルの単なるコンテナです。 Javaは、クラスパスを参照し、そこからクラスファイルをロードするクラスローダーを使用します。したがって、同じクラスx.y.Fooを内部に持つ2つのjar A.jarとB.jarがある場合、クラスパスの最初に来るjarのクラスがロードされます。 クラスパスがA.jar、B.jar(この順番で)の場合、A.jarのFooクラスが実行時に使用されます。 この矛盾は、私の経験

+0

を参照してください。私はantビルドファイルを "src"ではなくzipfilesetに "dir"属性を含めるように変更します。 –

1

いただきました平均重複してから非常に困難な修正のバグにつながることができますか?同じパッケージに同じ名前の2つのクラスを持つことはできません(あなたのプロジェクトはコンパイルされません)が、別のパッケージに同じ名前の2つのクラスがあることを意味するならば、 "ok"です。

+0

私は2つのjar:xxx.jarとyyy.jarを別々に使用しています。彼らは部分的に正確な実装を共有しています。さらに、私はこれらの2つの瓶を含む別の瓶を建てています。したがって、結果のjarファイルを開くと、同じパッケージ内にクラス名が重複して表示されます。 –

+0

質問ですが、両方のクラスが同じ機能を持っていますか?それが真であれば、1つのjarだけを指し示すことができます。例:yyy.jar(クラスを削除し、xxx.jar {keep class}を使用します) – elopez

0

私はここでは説明表示されていないもう一つの答えは、あなたがあなたの瓶、AARSの署名を予定している場合、あなたは

jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: com/foo/bar/baz.java 
関連する問題