독립 실행 형 Java 응용 프로그램의 경우 라이브러리 경로를 기반으로 런타임 중에 다음 코드를 사용하여 동적으로 jar lib를로드 할 수 있습니다. Java 웹 컨테이너에 동일한 코드를 배포하고 서블릿으로 실행하면 작동하지 않는 것 같습니다. 실제로 서블릿 요청에서 jar lib 경로를 기반으로 다른 jar 라이브러리를로드 할 수 있기를 원합니다.웹 컨테이너의 ClassLoader
그것은 하나의 서블릿이 /tmp/lib/v1.0/ 에서 jar 파일을로드 할 수 요청할 수 있습니다 비즈 논리를
USER1를 동적으로 런타임에 다른 항아리 libs와로드하고 이후 실행 할 수 있어야된다는 것을 의미합니다. 항아리
사용자 2는 (정확히 같은 클래스 이름을 가지고 1.0 버전과 1.1 버전의 jar 파일) /tmp/lib/v1.1/에서
감사를의 .jar
을 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());
}
}
}
}