7

顧客は、当社製品の新機能のプレビューを必要としています。彼らは、その機能を jar ファイル (パッチなど) で送信するように依頼しました。上記のjarファイルに新しいクラスを含めることに問題はありません。ただし、新しい機能を統合するために必要な既存のクラスが変更されました。製品のコア クラスを更新せずに、この新しい jar ファイルを追加したいだけです。問題は、別の jar を使用して既存のクラスをオーバーライドすることは可能かということです。もしそうなら、どのように?

前もって感謝します。

4

5 に答える 5

12

新しいjarを元のjarよりもクラスパスの前に置くと、うまくいく可能性があります。試してみる価値はありますが、それでも災害のレシピのように聞こえますが、少なくとも、何らかの理由で両方のクラスがロードされている場合、問題をデバッグするのは非常に困難です。

編集:これを少し前に書く予定でしたが、電車の旅の終わりによって中断されました...

私はお客様に戻って、お客様が求めていることは可能ですが、予期しない問題が発生する可能性があることを説明します. jar ファイルの更新は、より安全な修正であり、リスクははるかに少なくなります。「予期しない問題」や「リスク」というフレーズは、顧客に警鐘を鳴らす可能性が高いため、正しい対応をしてくれることを願っています。

于 2009-01-19T18:00:21.903 に答える
3

はい、いいえ、環境によって異なります。

たとえば、OSGi を使用していて、バージョンを管理している場合は、エクスポートされたパッケージを含む新しいバンドルをより高いバージョンでインストールするだけです (バージョンの範囲が十分に寛容であると仮定します)。

派手なカスタム クラスをロードせずにプレーンな古い Java を使用している場合は、(他の人が既に述べたように) クラス パスの前に配置することをお勧めします。

カスタム クラスのローディングがある場合は、「パッチを適用した」クラスが必要とするすべてのクラス、および実際には推移的な依存関係のハル全体が、パッチを適用したバージョンをロードしているクラス ローダーから見えるようにする必要があります。最悪の場合、アプリケーション全体を出荷する必要があることを意味します。

于 2009-01-19T18:55:22.837 に答える
2

元のJARが封印または署名されていない場合にのみ、更新されたクラスをクラスパスで置き換えるクラスの前に配置することを規定するすべての回答は正しいです。

于 2009-01-20T05:28:40.330 に答える
1

はい、元のjarよりもクラスパスの前に置くことで、可能かもしれません。ただし、クラスパスの順序付けに依存することが常に幸福につながるとは限りません。Java 言語仕様に記載されているかどうかはわかりません。そうでない場合は、異なる JVM や、同じ JVM の異なるバージョンでさえ機能しなくなります。

代わりに、新しい機能を現在のコードベースに統合するための現実的な時間枠を引用することを検討してください。これはおそらくあなたが探している答えではありません。

于 2009-01-19T18:45:18.070 に答える
0

おそらくこの特定のケースに必要な量よりも多いでしょうが、一般的に、既存のクラスを微調整または拡張したいだけの場合は、ロード時のウィービングでAspectJを使用することもできます。

于 2012-11-18T00:37:00.800 に答える