В схеме загрузки плоского класса отсутствует поддержка версий библиотеки. Вам необходимо использовать самую последнюю версию библиотеки и удалить другие версии из пути к классам.
Некоторые платформы, такие как OSGi, предоставляют механизмы для обработки этих случаев, но неясно, что вы полагаетесь на плагинную структуру.
Edit:
Что, если какая-то часть API Log4j изменилась в v1.2 (скажем, один единственный метод doIt()
подпись изменилась), и A и B вызывают doIt
. Что случится? Будет ли запущен мой проект? Сбой при первом использовании doIt
?
Вызов, основанный на отсутствующей подписи, скорее всего, приведет к NoSuchMethodError
. Это, вероятно, не произойдет, пока метод не будет вызван. Другие ошибки могут возникать, если другие механизмы полагаются на подпись (например, наследование класса).
Какую версию Log4j я должен поставить на classpath - v1.2 или обе?
Создание двух версий библиотеки на пути к классам приведет к случайной загрузке одного набора классов. Поведение будет неопределенным, но потенциально может привести к всевозможным неприятным ошибкам и исключениям.