Да. Есть три решения:
- Вы можете понизить свой код, чтобы использовать Lucene 3.5
- Вы можете обновить DISCO использовать Lucene 5.0 (либо самостоятельно, либо получая команды DISCO, чтобы сделать это)
- Вы можете использовать несколько
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, который позволяет выполнять операции, которые вы хотите, без использования каких-либо классов, которые этот загрузчик классов не нравится.
Вы используете maven? – KernelKoder
Нет, я просто использую Eclipse –