Редактировать : После просмотра пьесы, пример, который я использовал ниже, является tad , вводящим в заблуждение. Я ищу случай, когда у меня есть две сторонних банки (не доморощенные банки, где у меня есть доступ к исходному коду), которые обе зависят от разных версий одной и той же банки.
Оригинал:
Поэтому я недавно ознакомился с тем, что такое OSGi и какие проблемы («JAR Hell») он решает по своей сути. И, несмотря на то, что я заинтригован этим (и планирую мигрировать куда-то по дороге), у меня просто нет того, чтобы начать изучать, что потребуется, чтобы привести мои проекты к этому.
Итак, я сейчас оплакиваю: если со мной случится ад JAR, как мне решить эту проблему без OSGi?
Очевидно, что решение почти будет включать , чтобы написать свой собственный ClassLoader
, но мне трудно представить, как это проявится, и, что более важно, как это решит проблему , Я провел некоторое исследование, и все согласились с тем, что вам нужно написать свой собственный ClassLoader для каждого создаваемого вами JAR-файла, но, поскольку мне уже трудно смотреть на этот лес сквозь деревья, это утверждение не затонуло для меня.
Может ли кто-нибудь привести конкретный пример того, как написание моего собственного ClassLoader повлияло бы на эту зияющую рану пластырем (я знаю, я знаю, единственное реальное решение - это OSGi)?
Скажем, я пишу новый JAR-файл под названием SuperJar-1.0.jar
, который делает все виды удивительных вещей. Скажем, у моего SuperJar-1.0.jar
есть две другие зависимости, Fizz-1.0.jar
и Buzz-1.0.jar
. Банки Fizz
и Buzz
зависят от log4j
, за исключением того, что Fizz-1.0.jar
зависит от log4j-1.2.15.jar
, тогда как Buzz-1.0.jar
зависит от log4j-1.2.16.jar
. Две разные версии одной и той же банки.
Как решение на основе ClassLoader может решить эту проблему (в двух словах)?