Запускаемый JAR с дублирующимися зависимостями - PullRequest
3 голосов
/ 19 августа 2011

Я пытаюсь создать работоспособный JAR-файл с использованием Eclipse, но сталкиваюсь с проблемами. Рабочая область Eclipse содержит два отдельных проекта, которые зависят от одной и той же библиотеки. Я могу создать работающий JAR, но проблема в том, что при его запуске я получаю исключение java.lang.NoSuchMethodError.

Мне кажется, я получаю исключение java.lang.NoSuchMethodError, поскольку библиотеки имеют разные версии . Есть ли общее решение для устранения этой проблемы? Если нет, что бы вы порекомендовали мне сделать?

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Если основной номер версии изменяется, это означает, что обратная совместимость могла измениться.

Вы можете попробовать последнюю версию и надеяться, что они только что добавили методы и что старый способ работы, но даже если исключение NoSuchMethod не выброшено, нет никакой гарантии (возможно, с новым API вы должны вызывать разные методы получить те же результаты).

Я бы связался с поставщиком библиотеки и спросил, не нарушена ли совместимость. Если они не отвечают или он не работает, и у вас есть исходный код, единственной возможностью будет рефакторинг одной из библиотек (вероятно, 1.0); В.Г. положить все это в новый пакет v1. Тогда вам придется изменить проект, который зависит от него.

Если ничего из вышеперечисленного не сработает, то решением будет контейнер OSGi или настройка проекта A и проекта B в качестве двух разных исполняемых файлов и настройка проекта B в качестве сервера, отвечающего на сообщения проекта A. Грязный

0 голосов
/ 19 августа 2011

Как сказал SJuan, вы можете использовать OSGI для правильной настройки. http://en.wikipedia.org/wiki/Java_Classloader#JAR_hell

0 голосов
/ 19 августа 2011

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

  1. Удалите одно или несколько использований из вашего кода, которые вызывают NoSuchMethodError.
  2. Измените источник одной или нескольких библиотек, чтобы они могли счастливо сосуществовать.
  3. Используйте контейнер OSGi, который позволит вам иметь две версии одной и той же библиотеки в одном приложении.
...