Re: [問題] 為何不是import rt.java.lang.*
※ 引述《qrtt1 (null)》之銘言:
: A/
: com/
: qty/
: A.class
: B/
: com/
: qty/
: B.class
: C.class
: Foo.jar/
: com/
: qty/
: D.class
: A.class
在這個例子,我故意外了一個 com.qty.A 在 Foo.jar
這對預設的 classloader 來說,會造成意外的效果。
順便介紹這就是 class shadow 的問題。
因為預設的 classloader 只要找到 class 就不會繼續再找其他路徑了
當你的 A/com.qty.A 與 Foo.jar/com.qty.A 是不同版本的時候
在執行時就會發生一些不可預期的效果,
像是找不到對的 method 或是 method 參數對不上。
使用預設的 classloader 時,
當 CLASSPATH 的順序為 A 在 Foo.jar 之前
那麼就會優先使用 A/com.qty.A
當順序相反,Foo.jar 在 A 之前時
那麼就會優先使用 Foo.jar/com.qty.A
這種情況不只是會發生在類別,
透過 classloader 存取的設定檔,也會遭受影響
因為他們通常都在同樣的 default package (也就是/)
想要附帶提出這個"特性",
是因為看到新的 Eclipse 直接提供 fatjar 的功能會產生的效果
當您把所有 .jar 都合併在一起後,這種名稱遮蔽的衝突效果就會更容易出現
zip 格式可以容忍同樣的路徑。
全都壓縮在一起後,您就無法簡單透過修改 CLASSPATH 的順序來避免這個問題
PS. 若維護一些新版本版 library 混合的專案,
遇到找不到 method 也可以往這個方面來想
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.52.57
推
11/14 22:13, , 1F
11/14 22:13, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):