Ресурс Java Classloader виден только для определенного экземпляра

Я пытаюсь загрузить ресурс в свою среду выполнения для библиотеки. Но в моей текущей реализации его может видеть только очень конкретный экземпляр 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 библиотека фактически использует в качестве родителя. Лучшим решением было бы такое, при котором каждый загрузчик классов может получить доступ к ресурсу.

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


person Philipp    schedule 13.05.2018    source источник
comment
Кажется, что-то не так с вашим кодом - почему вы обращаетесь к свойству classLoader classLoader и secondClassLoader?   -  person schneida    schedule 14.05.2018
comment
Просто чтобы показать, в чем заключается моя проблема. Я хочу, чтобы мой ресурс был доступен каждому загрузчику классов, поскольку я не могу изменить библиотеку.   -  person Philipp    schedule 14.05.2018
comment
Хм, я все еще не понимаю. Код, который вы разместили, не будет компилироваться, поэтому, конечно, он не работает. В общем, чтобы ваши ресурсы были доступны для каждого отдельного загрузчика классов, вы должны иметь их в системном загрузчике классов или даже в загрузчике классов начальной загрузки. Afaik, вы можете сделать это только с помощью отражения: см., например, здесь: stackoverflow.com/a/60766/606513 Лучший подход будет создать свой собственный загрузчик классов, а также загрузить свою библиотеку через этот загрузчик классов. Таким образом, библиотека будет использовать тот же путь к классам, что и ваши внедренные библиотеки, и, таким образом, они будут видеть друг друга.   -  person schneida    schedule 15.05.2018


Ответы (1)


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

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

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

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

person code    schedule 22.08.2018
comment
Извиняюсь. Я отменил голосование. Спасибо, что указали на это. - person code; 18.09.2018