我们使用定制的类加载器将外部jar动态加载到我们的服务中。每天都会从网络上下载并覆盖诸如 /tmp/external/example.jar 之类的外部jar,只有成功下载了jar文件之后,才会这样创建一个新的类加载器:
File tmp = new File("/tmp/external/example.jar");
List<URL> classpathes = new ArrayList<URL>(Arrays.asList(((URLClassLoader)parent).getURLs()));
classpathes.add(tmp.toURL());
ClassLoader newClassLoader = new URLClassLoader(classpathes.toArray(new URL[0]), parent);
现在的问题是,某些类可以由 newClassLoader 加载,而有些类在调用Class.forName(clazzname, true, newClassLoader)
时会抛出ClassNotFoundException,即使这些类位于同一包下。当我以与服务相同的方式在主测试中加载它们时,所有类都存在,并且jar文件格式正确。
出什么问题了?