2015-04-30 2 views
2

В моем приложении используется Lucene 5.0, и я также использую DISCO java library, который, в свою очередь, использует Lucene 3.5. Когда я импортирую контейнер DISCO, я больше не могу запускать программу, потому что получаю ошибки времени выполнения в отношении классов Lucene, которые конфликтуют между двумя версиями библиотеки.Как разрешить внешнюю библиотеку, вызывающую конфликты JAR?

Есть ли способ решить эту проблему?

+0

Вы используете maven? – KernelKoder

+0

Нет, я просто использую Eclipse –

ответ

1

Да. Есть три решения:

  1. Вы можете понизить свой код, чтобы использовать Lucene 3.5
  2. Вы можете обновить DISCO использовать Lucene 5.0 (либо самостоятельно, либо получая команды DISCO, чтобы сделать это)
  3. Вы можете использовать несколько ClassLoader s, чтобы изолировать код.

Последний пункт работает с двумя классами в Java являются одинаковыми, если полное имя такое же и, когда они были загружены одним и тем же ClassLoader.

OSGi framework может делать трюки, подобные этому. Eclipse использует Equinox, который является реализацией OSGi.

Один из вариантов заключается в том, чтобы связать все и настроить OSGi для правильной загрузки.

Чтобы решить вашу проблему самостоятельно, вы можете создать два ClassLoader s. Один загружает ваше приложение и Lucene 5.0. Другие нагрузки DISCO и Lucene 3.5.

Уродливая часть состоит в том, что теперь вы можете получить ClassCastException для занятий в Луцене. Они будут иметь одинаковое имя, но они не будут такими же, как Java (разные загрузчики классов). Чтобы иметь возможность передавать данные между двумя загрузчиками классов, вам нужен родительский ClassLoader, у которого есть POJO, в котором вы можете поместить все данные, которые хотите разделить. java.lang.String также будет в этом ClassLoader (в противном случае все будет очень, очень сложно).

Общие зависимости могут также поступать в родительском ClassLoader.

Для этого вам нужен тонкий слой адаптера поверх кода DISCO/Lucene, который позволяет выполнять операции, которые вы хотите, без использования каких-либо классов, которые этот загрузчик классов не нравится.

Смежные вопросы