クラスローダーの動作について興味深い質問があります。クラスローダーの問題
質問1:クラスローダーがjarをロードする順序は何ですか?
次のjarファイルやクラスを含むが与えられている:
クラスがロードされますa.jar
+-com/scheffield/foo/A.class
b.jar
+-com/scheffield/foo/B.class
?
質問2:クラスパス内のファイルのパスと名前が一意であることは本当ですか?
次のjarファイルおよびクラスが与えられる含む(現実世界の例):
spring-beans-3.0.3.RELEASE.jar
+-META-INF/spring.schemas
spring-aop-3.0.3.RELEASE.jar
+-META-INF/spring.schemas
私はあなたを伝えることができ、何が(this articleを参照)両方のファイルがそうでない場合、例外が発生する春によってロードされていることです。
は、なぜ私はそれを求めています:
私はいわゆる大きな瓶(cookbook entry for gradle)を作りました。アプリケーションクラスと他のすべての依存関係を解凍して大きなジャーにパケット化したものです。そして、重複したファイルをどうすればいいのかは絶対にわかりません。
Jarは、クラスパスに表示されている順序でロードされます。私はあなたの質問が正しいかどうかは確かではありませんが、あなたが '春の豆...瓶'と '春の瓶...'を解凍してその内容で瓶を作ったなら、 'spring.schemas'の一つがもう1つ(解凍した注文に応じて)。 – khachik
OK、最初の質問に答えました。 'spring.schemas'は、ファイルを上書きしたものです。これは例外につながる。しかし、私がジャーを別々にロードしても、例外は発生しません。これはどのように可能ですか? – scheffield
@khachik:BTW zipには、同じパスと名前を持つ複数のファイルを含めることができます。 :D – scheffield