Это возможно и фактически полностью поддерживается и прекрасно работает.
Мне приходилось делать это в производственной среде, и на солнечной JVM это очень хорошо.
По сути, если вы загружаете библиотеку из другого загрузчика классов, она загружает другую копию библиотеки. Это так просто.
Я бы не советовал делать это, если вам действительно не нужно ... но это работает.
В качестве альтернативы, в зависимости от ваших конкретных требований, вы можете просто сделать это вне процесса и иметь простой протокол (используя, скажем, jetty / xstream / httpclient или netty) между клиентом и различными серверами, каждый из которых загружена другая версия DLL.
По сути, это означает, что вы пишете загрузчик классов
public class MyClassLoader extends URLClassLoader {
protected String findLibrary(String libName) {
if ( libName.equals("mylib.dll")) {
return "full/path/to/library";
}
else {
super.findLibrary(libName);
}
}
}
Затем вы организуете загрузку реализации вашего класса, используя соответствующий загрузчик классов ...
public interface Implementation {
}
public class ImplementationLookerUpper {
Classloader v1 = new MyClassloader(version1);
Classloader v2 = new MyClassloader(version2);
public Implementation implementationUsingVersion(Version someversion) {
Classloader classloader = pickCorrectClassLoaderForVersion(someVersion);
return (Implementation) classloader.loadClass(RealImplementation.class.getName()).newInstance();
}
}
Такого рода вещи .....