作者qrtt1 (null)
看板java
标题Re: [问题] 为何不是import rt.java.lang.*
时间Sun Nov 14 21:55:10 2010
※ 引述《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
1F:推 a1234957:有提供fatjar的功能?! 3.6吗? 11/14 22:13