对于独立的 java 应用程序,我可以使用以下代码在运行时根据库路径动态加载 jar lib。如果我在 Java Web 容器中部署相同的代码并作为 servlet 运行,它似乎不起作用。我实际上希望能够根据 servlet 请求中的 jar 库路径加载不同的 jar 库。
这意味着单个 servlet 必须能够在运行时动态加载不同的 jar 库并运行向前的 biz 逻辑
user1 可能会请求在 /tmp/lib/v1.0/ .jar下加载 jar 文件
user2 可能会请求在 /tmp/lib/v1.1/ .jar下加载 jar 文件
(v1.0 和 v1.1 中的 jar 文件得到完全相同的类名)
谢谢!!!
=== 主要 ==============
LibraryLoader loader = new LibraryLoader();
loader.addClassPath(<jar lib root path>);
// below will run biz logic
=== LibraryLoader.java ==========
public class LibraryLoader {
URLClassLoader urlClassLoader;
public LibraryLoader() {
urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
}
public void addClassPath(String jarLibPath) throws Exception {
Class urlClass = URLClassLoader.class;
File jarPath = new File(jarLibPath);
FileFilter jarFilter = new FileFilter() {
public boolean accept(File f) {
if (f.isDirectory())
return true;
String name = f.getName().toLowerCase();
return name.endsWith("jar");
}
};
File[] files = jarPath.listFiles(jarFilter);
for (File file : files) {
if (file.isFile()) {
URI uriPath = file.toURI();
URL urlPath = uriPath.toURL();
Method method = urlClass.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(urlClassLoader, new Object[] { urlPath });
System.out.println(file.getCanonicalPath());
} else {
addClassPath(file.getCanonicalPath());
}
}
}
}