我有一个应用程序,该应用程序被部署为应用服务器中的war
文件。我需要在不停止服务的情况下在jar
处添加新的runtime
文件。之后,我将根据数据库中存储的bean xml
定义创建bean。
我已经在Internet上看到了解决方案,该解决方案使用URLClassLoader
加载类,并使用特定的classname
加载方法调用。但是我的要求是加载类并能够随时创建bean,而不必担心classnames
。
我尝试过的代码。
String pathToJar = "/home/sample.jar";
JarFile jarFile;
List<String> classes = new ArrayList<String>();
try {
jarFile = new JarFile(pathToJar);
Enumeration<JarEntry> e = jarFile.entries();
URL[] urls = { new URL("jar:file:" + pathToJar + "!/") };
URLClassLoader cl = URLClassLoader.newInstance(urls, AppzillonRestWS.class.getClassLoader());
int i = 0;
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
if (je.isDirectory() || !je.getName().endsWith(".class")) {
continue;
}
String className = je.getName().substring(0, je.getName().length() - 6);
className = className.replace('/', '.');
Class c = cl.loadClass(className);
if(className.contains("tbAsmi") && !className.contains("_PK")){
classes.add(className);
System.out.println(className);
}
i++;
System.out.println(i);
}
jarFile.close();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
后来我试图从jar加载的类中创建bean。但是得到"ClassNotFoundException"
。任何输入将不胜感激。
发生ClassNotFoundException的原因是无法在Env或classpath中找到类,所以首先请确保是否已加载该类。