1

ClassLoader の definePackage を使用して、jar 内から一部のパッケージをオーバーライドできますか?

たとえば、アプリケーションには現在、abc.jar の「javax.xml.bind」が含まれています。def.jar に別のバージョンの javax.xml.bind が含まれている ClassLoader.definePackage(def.jar) を呼び出す場合、アプリケーション全体のクラスパスを def.jar のクラスパスを指すように置き換えることはできますか? ありがとう。

4

1 に答える 1

2

いいえ、 jar 内から一部のパッケージを「オーバーライド」するために使用することは絶対にできません。ClassLoader.definePackage

私の理解が正しければ、JVM に javax.xml.bind の下の任意のクラスを def.jar からロードさせ、他のすべてのクラスを abc.jar からロードさせる必要があります。この場合、次のことができます(私の個人的な好みの順序で):

1) CLASSPATH の abc.jar の前に def.jar を置きます。これには、abc.jar からロードするクラスが def.jar に存在しないことが必要です。

2) def.jar、abc.jar、またはその両方を解凍し、競合するクラスをすべて削除して、CLASSPATH で最初に来る jar が実際には無関係になるようにします。次に、それらを再圧縮します。または、これを 1 つの jar でのみ実行し、他の jar の前に配置することもできます。

3) 構成可能なクラスローダーを使用します (申し訳ありませんが、私が知っているパブリック ドメインのものはありません。見つけたらお知らせください)。これは、OS プロジェクトにとって興味深いトピックになる可能性があります。ただし、類似の (しかしより広範な) 目的を持ついくつかのイニシアチブが既に進行中であり、その一部は言語の中核にあります。

4) この目的のためにクラスローダーを作成し、おそらくデフォルトのものを拡張します。

于 2013-08-09T01:53:54.617 に答える