Ресурс Java Classloader виден только конкретному экземпляру - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь загрузить ресурс во время выполнения для библиотеки.Но в моей текущей реализации его может видеть только очень специфичный экземпляр URLClassLoader.

URLClassLoader classLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
classLoader.addFile(super.getResource(urlPath));

classLoader.classLoader.getResourceAsStream(path) //works

URLClassLoader secondClassLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
secondClassLoader.classLoader.getResourceAsStream(path) // doesn't work 

Другая проблема заключается в том, что я не знаю, какой ClassLoader библиотека фактически использует в качестве родительского.Лучшим решением будет то, где каждый загрузчик классов может получить доступ к ресурсу.

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

1 Ответ

0 голосов
/ 22 августа 2018

Похоже, у вас есть два варианта (хотя оба решения работают по схожему принципу).

Общее решение (нет пользовательских загрузчиков классов): загрузите ресурс из вашего загрузчика классов приложения. Этого можно достичь, убедившись, что расположение ресурса включено в путь к классу приложения (сохранение ресурса как части файла jar приложения - один из способов достижения этого).

Немного сложнее (с пользовательскими загрузчиками классов): в этом сценарии вы должны убедиться, что путь к ресурсу добавлен в путь к классам всех пользовательских загрузчиков классов. Более простой и понятный подход - определить супер-пользовательский загрузчик классов и унаследовать все другие загрузчики классов от этого супер-загрузчика. И загрузите ресурс в classpath суперклассировщика классов.

К настоящему времени, я надеюсь, у вас есть идея основополагающего принципа: Загрузчики классов смогут загружать данный ресурс, если он виден в пути к классам своих родителей (рекурсивно) или в своих собственных путях к классам.

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