質問: Javaの基本的なことで教えてください. あるantベースのツールキットで動作させるプラグインを作成しています.私のプラグインはICU()の少し古いバージョンのicu4j-4_8.jarを使用しています.ツールキットはオープンソースでどんどんバージョンが上がってゆきます.またツールキット自身がプラグインに来る前の前処理で同様にICUを使用しているようです.このバージョンが最新のものでは、icu4j-54.1.jarになっています.手元にある古いものではicu4j_3_4_5.jar(?)あたりのようです. 問題はプラグインは複数のバージョンのツールキットで動作するようにサポートしなければならない点ことです.ところがツールキット自身が使用するICUのバージョンが異なることにより、私のプラグインのステップの処理が呼び出された時点では、antのxsltタスクでclasspathrefでicu4j-4_8.jarを参照するようにしても、すでにロード済みと考えられる異なったバージョンのICUが使用されてしまいます.これは複数のバージョンのツールキットで私のプラグインをテストして結果を見てわかりました. このような事情なのですが、antのtaskで特定のICUのバージョンの.jarを使用するように強制することはできるのでしょうか? 以上 よろしくお願いいたします.
回答: 1つのクラスローダーに同じ名前のクラスを複数ロードすることはできません。 従って取り得る手段としては以下のどちらかの方針のものになります。 * 本体と自作プラグインでクラスローダを分ける。 プラグインで用いるものはプラグイン用のクラスローダでロードして使用する。 * 片方のクラス名(完全修飾クラス名)を変更する。 名前を変えることで別クラスとして扱う。 「antのtaskで」というのがどの程度のことを想定されているかにもよりますが、通常行うレベルではどちらも不可能です。 「antのtask」以外の方法で実現することを考えた場合でも、前者はエントリポイントである本体側のサポートが必要です。現状実現できていないということは本体の改変が必要ということで、それはおそらく今回採用できないと思われます。 そうすると残るのは後者ということになります。 具体的な方法ですが、icu4jを構成するクラス群は接頭詞`com.ibm.icu`を持つパッケージに属しているようなので、ver4.8のクラスのパッケージ名を例えば`hoge.icu`から始まるように変更し、自作プラグインではこちらを使用するようにします。 これで本体側で使用しているicu4jには依存しなくなります。 (ライブラリによっては、ライセンス上改変が許可されていなかったり、ソースが公開されておらず変更が困難だったりしますが、icu4jはいずれも問題ないように見えます。)