Java Classloader не выпускает дескриптор файла под Windows - PullRequest
2 голосов
/ 10 сентября 2011

Приложению необходимо загрузить классы из jar-файлов, предоставляемых во время выполнения. Предполагается, что эти jar-файлы должны быть удалены и заменены другими jar-файлами во время выполнения, что приводит к сбою, так как, казалось бы, ClassLoader не освобождает дескриптор файла, полученный на jar-файлах.

Это известная проблема? Есть ли в наличии загрузчик классов, у которого нет этой проблемы?

Edit: сценарий использования не о загрузке разных версий одного и того же класса, а о загрузке разных реализаций одного и того же интерфейса. Классы реализуют интерфейс с методом execute, который приложению придется вызывать. Таким образом, хотя механизм выгрузки для классов также будет полезен в этом контексте, это не основной вариант использования.

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Посмотрите на это По какой причине setDefaultUseCaches (false) URLConnection охотно вызывается в org.apache.catalina.core.JreMemoryLeakPreventionListener .

Возможно, он может ответить на ваш вопрос,При использовании UrlConnection и установке кеша true, он не закроет обработчик файла.

Также он дает обходной путь для установки кеша false.

URL url = new URL("jar:file://dummy.jar!/");  
URLConnection uConn = new URLConnection(url) {  
    @Override
    public void connect() throws IOException {          
      // NOOP     
    }  
};
uConn.setDefaultUseCaches(false); 

Это нужно просто вызвать встатический блок перед использованием URLConnection.

Это зависит от того, как реализован ваш загрузчик классов.

1 голос
/ 10 сентября 2011

ClassLoader не освобождает jar, пока не загрузится загрузчик классов. Вы не можете загрузить новые версии классов, не создав новый загрузчик классов, поэтому я не понимаю, как вы хотите, чтобы это работало.

Возможно, вам нужен контейнер OSGi, такой как Apache Karaf, который позволяет загружать / выгружать библиотеки во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...