OneJar и динамическая загрузка классов
В настоящее время мы изучаем использование OneJar в нашем приложении (по ряду причин), но наше приложение использует ряд пользовательских URLClassloader
s, чтобы загрузить расширения приложения.
Когда в комплекте как банка "OneJar", мы получаем ClassNotFound
исключения. Рассматриваемые классы находятся в комплекте Jar, и мы просто полагаемся на механизм загрузчика классов для разрешения отношений родитель / потомок.
То есть. У нас есть общее interface
который хранится в комплекте Jar (который должен быть внутри контекста загрузчика классов родителя). Расширение реализует это interface
(позволяя нам вызывать расширение) и полагается на способность дочернего загрузчика классов использовать возможности поиска ресурсов родительского загрузчика классов.
Был ли у кого-нибудь опыт с этим или пролил свет на то, как мы могли бы решить его?
Я был бы заинтересован в других подобных механизмах (для объединения нашей библиотеки Jar в один ресурс Jar, который не требует использования для разархивирования всего и Jar в один файл)
1 ответ
Я обнаружил, что делаю некоторые предположения о том, как был создан наш загрузчик классов.
Я предполагал, что загрузчик классов будет использовать его загрузчик классов как родительский (т.е. getClass(). GetClassLoader()), но это не было
Вместо этого он использовал SystemClassLoader
, Это означало, что когда дочерний загрузчик классов искал общий интерфейс, он не мог его найти (потому что он смотрел на SystemClassLoader
а не загрузчик классов OneJar).
Я исправил это, добавив CustomClassLoader.class.getClassLoader()
конструктору нашего пользовательского загрузчика классов