在JDK1.5里面自带了JAXP1.3,可是在我们的应用中要使用到JAXP1.4,根据类加载的原理,如果相同的CLASSLOADER中存在已经加载了一个相同的类,这里指的相同的类就是类的绝对路径相同,就不会再加载另外相同的类了,这个时候即使把JAXP1.4放到我们的应用中,相同的类也是不会被JVM所加载,即此时JAXP1.4是不起作用的。
这个时候我采取了通过在应用中去加载JAXP1.4的方式,就是通过URLClassloader将其加载到相应的SystemClassLoader(即AppClassLoader)中,这个倒是可以把JAXP1.4加载进去,功能正常。将应用发布到Websphere中,发现JAXP被加载到了BootstrapClassLoader中(Why?),通过client应用,发现JAXP被加载到了AppClassLoader中,都可以正常使用。
我的问题是:这个时候JAXP1.4为什么通过被加载进去?覆盖原理是什么?另外就是为什么在WS中JAXP被加载到了BootstrapClassLoader中?先谢了。
以下是使用自定义加载的JAVA类:
public static void addJarFileToClasspath(File jarFile, boolean addMainfestClasspath) throws IOException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
List<URL> urls = new ArrayList<URL>(5);
urls.add(jarFile.toURI().toURL()); if (addMainfestClasspath) {
JarFile jf = new JarFile(jarFile);
Manifest mf = jf.getManifest(); 
if (mf != null) {
String cp = mf.getMainAttributes().getValue("class-path");
if (cp != null) {
for (String cpe : cp.split("//s+")) {
File lib = new File(jarFile.getParentFile(), cpe);
urls.add(lib.toURI().toURL());
}
}
}
jf.close();
} URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<? extends URLClassLoader> sysclass = URLClassLoader.class; Method method = sysclass.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
for (URL url : urls) {
method.invoke(sysloader, url);
} }
javaclassloader类加载jaxp