OneJar и динамическая загрузка классов

В настоящее время мы изучаем использование OneJar в нашем приложении (по ряду причин), но наше приложение использует ряд пользовательских URLClassloaders, чтобы загрузить расширения приложения.

Когда в комплекте как банка "OneJar", мы получаем ClassNotFound исключения. Рассматриваемые классы находятся в комплекте Jar, и мы просто полагаемся на механизм загрузчика классов для разрешения отношений родитель / потомок.

То есть. У нас есть общее interface который хранится в комплекте Jar (который должен быть внутри контекста загрузчика классов родителя). Расширение реализует это interface (позволяя нам вызывать расширение) и полагается на способность дочернего загрузчика классов использовать возможности поиска ресурсов родительского загрузчика классов.

Был ли у кого-нибудь опыт с этим или пролил свет на то, как мы могли бы решить его?

Я был бы заинтересован в других подобных механизмах (для объединения нашей библиотеки Jar в один ресурс Jar, который не требует использования для разархивирования всего и Jar в один файл)

1 ответ

Решение

Я обнаружил, что делаю некоторые предположения о том, как был создан наш загрузчик классов.

Я предполагал, что загрузчик классов будет использовать его загрузчик классов как родительский (т.е. getClass(). GetClassLoader()), но это не было

Вместо этого он использовал SystemClassLoader, Это означало, что когда дочерний загрузчик классов искал общий интерфейс, он не мог его найти (потому что он смотрел на SystemClassLoader а не загрузчик классов OneJar).

Я исправил это, добавив CustomClassLoader.class.getClassLoader() конструктору нашего пользовательского загрузчика классов

Другие вопросы по тегам