Управление зависимостями от нескольких версий библиотеки в Java и Eclipse - PullRequest
7 голосов
/ 19 января 2010

В среде Eclipse у меня есть проект A. У A есть зависимости от проектов или библиотек B и C. (Не имеет значения, являются ли они проектами или библиотеками) B зависит от LibX.v1, а C зависит от LibX.v2. Во время выполнения A потребуются B.jar и C.jar. Также классам в B.jar понадобится LibX.v1, а классам в C.jar - LibX.v2. Будучи разными версиями одной и той же библиотеки, LibX.v1 и LibX.v2 имеют одинаковые классы, поэтому вполне возможно, что класс может быть загружен из неправильной версии библиотеки во время выполнения, что вызывает много проблем. Как мне управлять такими ситуациями?

С уважением Seref

Ответы [ 2 ]

4 голосов
/ 20 января 2010

вам нужно будет использовать механизм «множественного загрузчика классов» (это то, на что способен OSGI).В таком сценарии загрузчик классов для класса B может видеть только LibX.v1, а загрузчик классов C видит только LibX.v2.Вы можете сделать это с OSGI, но OSGI гораздо больше, чем это, и начать работу с ним нетривиально.Другой плагин-фреймворк - JPF , который также предлагает больше, чем просто использование нескольких загрузчиков классов.я думаю, что они оба используют принцип 1 загрузчик классов на плагин (модуль, что угодно, ...)возможно взгляните на classworlds .Я думаю, что это возможно сделать с этой библиотекой.Преимущество состоит в том, что он фокусируется на аспекте загрузки классов.документация не очень хорошая.classworlds использует понятие классов классов.взгляните на пример использования API на сайте.Я добавлю пример здесь, если я найду один.во всяком случае, нет тривиального решения для этого, я думаюРазумеется, решение этой проблемы с помощью управления зависимостями - лучшее решение, но это не всегда возможно.

4 голосов
/ 19 января 2010

Действительно, нет. Большинство загрузчиков классов Java не дают никаких гарантий относительно порядка загрузки библиотек, поэтому вам действительно следует убедиться, что вы не дублируете зависимости на вашем пути к классам. Я бы проверил, может ли B или C быть обновлен до более новой версии или LibX полностью обратно совместим.

Редактировать : на самом деле, я нашел то, что может вам помочь. Он называется OSGi, и я не использовал его, но кажется, что он может делать то, что вы пытаетесь сделать. Вот ссылка на вступительную статью.

...