2011-06-21 15 views
9

JavaプロジェクトmyProjectがあり、外部ライブラリjar(someJar.jar)を使用していて、クラスがcom.somepackage.Class1.classであるとします。Javaで "duplicate class"を避ける方法

ここで、元のjarのバグを修正するClass1.javaの更新版が見つかりました。

私はパッケージの下に自分のソースコード内の新しいClass1.javacom.somepackage

私はプロジェクト(例えば、Netbeansのを使用して)を構築する場合、また持つクラスを含むクラスcom.somepackage.Class1.classdist\lib\someJar.jarが含まれていdist\myProject.jarがあるが含まれます同じ名前。

ファイルを実行すると(java -jar dist\myProject.jarなど)、新しいバージョンのClass1.classが(必要に応じて)使用されます。

  1. Javaは、そのような重複の場合にどのクラスファイルを実行するかをどのように決定しますか?優先順位を指定できる方法はありますか?

  2. このような衝突を回避するための「正しい」方法はありますか?

  3. Proguardでは、コードを圧縮しようとすると、duplicate classエラーが発生します。どうすればこれを排除できますか?

答えて

4
  1. を持って提供

    Javaはクラスパスの順序に基づいてどちらを使用するかを決定します。あなたのものを最初に挙げてください。あなたは大丈夫でしょう。

  2. "正しい"方法は、信号源を修正することですが、必ずしもオプションではない場合もあります。

  3. 私はProGuardを使用していませんが、重複したクラスが存在する前に、私は再度ライブラリを読み替えています。私の場合の解決策は、Antに重複クラスを無視するように指示することでした。私はProGuardもそのサポートを持っていると思います。

6

バグ修正を含む更新されたjarファイルを作成できませんか?あなたが同じ完全修飾クラスの2つのバージョンを持っていなければ、もっと簡単になります。

+0

私はそれを行うことができます。しかし、将来、誰かがそのバールをアップグレードされたバージョン(バグ修正なし)に置き換えると、変更は失われます。私はバグ修正が失われていないことを保証するためにプロジェクトにJavaソースコードを保存することを好みます。ビルドツールでそれを行うことは可能ですか?注:バグ修正はライブラリの正式リリースの一部ではなく、次のライブラリの一部でもありません。 – Jus12

+0

@ Jus12:jarファイルのコピーを作成し、そのクラスだけを更新することで、ビルドプロシージャの一部として更新されたjarファイルを作成することができます。しかし、私はあなたがまだ問題を抱えていると言いたい - クラスは* jarファイルの新しいバージョンで更新されている可能性があるので、スタンドアロンのバグ修正クラスファイルを使用すると問題が発生する可能性がある。バグ修正*が新しいバージョンの瓶に含まれない理由はありますか? –

+0

私は 'smack' xmppライブラリについて話しています。バグ修正は' BOSH'の追加サポートです。今のところ、smackはBOSHをサポートしておらず、このハックは動作させるために必要です。なぜ彼らがまだそれをサポートしていないのか分かりません。 – Jus12

1

1)更新されたJarはより良い解決策です。

2)別のクラス名を使用してください。同じクラス名と同じ梱包を使用したい理由がありますか?私は理由があるとは思わない。

3)瓶へのすべての呼び出しをカプセル化するラッパー/プロキシクラスを作成し、バグを修正し、この新しいクラスを呼び出すために決めることができます(それは別の名前とパッケージング)

+3

クラス(バグあり)がサードパーティコードでインスタンス化されている場合は、 –

+0

それで、私は同じ名前をつけなければならなかったのです。 – Jus12

関連する問題