Смешивание разных версий библиотек Java - PullRequest
8 голосов
/ 08 ноября 2008

Мой проект использует библиотеки Java, которые имеют свои собственные зависимости (например, Hadoop, Jetty). Я в конечном итоге с разными версиями одних и тех же зависимостей, как муравей 1.4.5, 1.4.6. Мой проект может использовать муравей 1.4.7. Это небольшой пример, который может стать более сложным с большими зависимостями, такими как HTTP Commons.

Как заставить все библиотеки и зависимости играть хорошо? Есть ли способ изолировать каждую библиотеку (Hadoop, Jetty), чтобы они использовали только свои зависимости?

Ответы [ 5 ]

2 голосов
/ 10 ноября 2008

JarJar на помощь!

Муравей считает, что оба: 1) упаковывают много jar-файлов в один и 2) позволяют переименовывать зависимости в файлах классов и таким образом загружать две версии одной и той же библиотеки!

2 голосов
/ 08 ноября 2008

Вы можете управлять всем этим с помощью структуры управления зависимостями, такой как OSGI. Взгляните на пружинный каркас динамических модулей http://www.springsource.org/osgi

Вы также можете взглянуть на ту часть инфраструктуры, в которой Eclipse реализует OSGI. Взгляните сюда http://www.eclipse.org/osgi/

Короткий ответ - просто перейти к наименьшему общему знаменателю. Помните, что «одобренный» каталог - ваш друг, когда дело доходит до управления конфликтующими зависимостями.

2 голосов
/ 08 ноября 2008

Maven также, как правило, справится с этим довольно хорошо. Если не полностью, он по крайней мере справится с большей частью, тогда вы можете разобраться с оставшимися проблемами.

Конечно, это означает, что вы должны изменить свой процесс сборки, но это может стоить вашего времени, чтобы не вырывать волосы из-за этого.

1 голос
/ 08 ноября 2008

Если у вас есть исходный код, скомпилируйте все вместе. Если вы этого не сделаете, то, к сожалению, вам придется выбрать источник для наименьшего общего знаменателя с целевым параметром javac. Это необходимо делать только в том случае, если при запуске приложения возникают реальные проблемы, которых редко должно быть, если jvm является текущей версией (Java очень строго относится к двоичной совместимости со старыми версиями).

0 голосов
/ 11 ноября 2008

J G упомянул OSGi, что было даже моей первой мыслью при чтении этого вопроса.

Наличие нескольких версий одной и той же библиотеки является сильной стороной OSGi. Если у нас уже есть некоторые сторонние продукты, я думаю, что будет справедливо упомянуть и спецификацию.

Вы можете получить его с официального сайта OSGI http://osgi.org

...