Я знаю, это может быть глупый вопрос для опытных программистов. Но у меня есть библиотека (http-клиент), которую требуют некоторые другие фреймворки / банки, используемые в моем проекте. Но все они требуют разных основных версий, например:
httpclient-v1.jar => Required by cralwer.jar
httpclient-v2.jar => Required by restapi.jar
httpclient-v3.jar => required by foobar.jar
Достаточно ли умен загрузчик классов, чтобы как-то их разделить? Скорее всего, нет? Как с этим справляется загрузчик классов, если класс одинаковый во всех трех банках. Какой загружается и почему?
Загрузчик классов берет только одну банку или произвольно смешивает классы? Так, например, если класс загружается из Version-1.jar, все остальные классы, загруженные из того же загрузчика классов, попадут в одну и ту же банку?
Как вы справляетесь с этой проблемой?
Есть ли какой-нибудь трюк, чтобы каким-то образом «включить» jar-файлы в «required.jar», чтобы они воспринимались как «одна единица / пакет» Classloader
или как-то связаны?
источник
Каждая загрузка класса выбирает ровно один класс. Обычно находят первым.
OSGi стремится решить проблему нескольких версий одной и той же банки. Equinox и Apache Felix - распространенные реализации OSGi с открытым исходным кодом.
источник
Загрузчик классов сначала загрузит классы из jar-файла, который оказался в пути к классам. Обычно несовместимые версии библиотеки будут иметь различие в пакетах, но в маловероятном случае они действительно несовместимы и не могут быть заменены одним - попробуйте jarjar.
источник
Загрузчики классов загружают класс по запросу. Это означает, что класс, требуемый первым для вашего приложения и связанных библиотек, будет загружен раньше других классов; запрос на загрузку зависимых классов обычно выдается во время процесса загрузки и связывания зависимого класса.
Вы, вероятно, столкнетесь
LinkageError
с утверждением, что повторяющиеся определения классов встречаются для загрузчиков классов, как правило, не пытаются определить, какой класс должен быть загружен первым (если в пути к классам загрузчика присутствуют два или более классов с одинаковым именем). Иногда загрузчик классов загружает первый класс, встречающийся в пути к классам, и игнорирует повторяющиеся классы, но это зависит от реализации загрузчика.Рекомендуемая практика для устранения таких ошибок - использовать отдельный загрузчик классов для каждого набора библиотек, которые имеют конфликтующие зависимости. Таким образом, если загрузчик классов попытается загрузить классы из библиотеки, зависимые классы будут загружены тем же загрузчиком классов, который не имеет доступа к другим библиотекам и зависимостям.
источник
Вы можете использовать
URLClassLoader
for require для загрузки классов из jar-версии diff-2:источник