以前,一些 org.apache 包“按原样”包含在 JRE jar 中,具有完整的 org.apache 包名称。
这意味着,如果我的一个类想要使用,比如说,Xerces DomUtil,并且有一个
import org.apache.xerces.util.DOMUtil;
根类加载器会将此类解析为 JRE 中的 Xerces 版本。
如果我想使用更新或不同版本的 Xerces,我不能将它包含在我的应用程序类路径中,因为类加载器系统会优先考虑打包在 JRE 中的 Xerces。
现在这种情况发生了变化。他们获取了 org.apache 包,并将它们更改为 com.sun.org.apache...internal...
所以,如果我想直接使用 JRE 打包的 Xerces,我可以导入:
import com.sun.org.apache.xerces.internal.util.DOMUtil;
(Eclipse 会报错,告诉我们不要在 com.sun 中使用包 .. 但类仍然存在,如果我们愿意,我们可以更改访问限制)
所有 JRE 类(如 JAXP)都使用此版本。
这让我可以自由地将更新版本的 Xerces 放入我的类路径,并在我的应用程序中使用它,而不会干扰 JRE 的。
通过简单地重命名包来重新打包它们。这意味着将其从例如文件夹中移出
org/apache/xerces/util
到文件夹
com/sun/org/apache/xerces/internal/util
在一些 JRE 人的硬盘上,然后在 .java 文件中更改
package org.apache.xerces.util;
至
package com.sun.org.apache.xerces.internal.util;
因此,从 JVM 的角度来看,它们是完全不同的类。