Maven. Переходные зависимости
Мой проект P зависит от зависимости A, которая зависит от зависимости B. Файл pom.xml моего проекта включает A в качестве зависимости, а его jar-файл включен в путь к классу P. Тем не менее, есть NoClassDefFoundError
брошенный во время выполнения P, который происходит от отсутствующих банок B.
Разве Maven не должен загружать эти зависимости автоматически?
3 ответа
Мой проект P зависит от зависимости A [с областью компиляции], которая зависит от зависимости B [с областью компиляции].
Если B не является необязательной зависимостью от A, B должна быть зависимостью от P с областью "compile(*)" (см. Таблицу " Область зависимостей" и прочитайте примечание) и, следовательно, должна быть доступна во время выполнения.
Тем не менее, во время выполнения P генерируется ошибка NoClassDefFoundError, которая возникает из-за отсутствия B-файлов.
Поскольку вы запускаете проект в Eclipse, путь к классу настроен для вас, поэтому я исключу ошибку на этом уровне. Это оставляет нас в случае необязательной зависимости.
PS: очень полезный инструмент для исследования такого рода проблем dependency:tree
,
Если эта зависимость A имеет область компиляции - конечно, она должна была быть загружена и более перегружена доступной в classpath проекта. Но если бы он предоставил сферу, это имело бы место, так как предоставленные deps не были бы упакованы с приложением Maven.
Кстати, как у вас работает этот проект - неправильная работа может вызвать такие проблемы, и это очень хорошее предположение. Например - если вы используете плагин maven exec - maven правильно настроит classpath для вас, но в противном случае - вы должны установить его самостоятельно (или создать jar с зависимостями с помощью плагина сборки).
Я пишу свое собственное решение / ситуацию, поскольку ни один из других ответов не решил мою проблему.
В моем случае мой проект (ME
) зависел от другого проекта (LIB
), который зависел от другого проекта (open-csv
).
Однако я заметил старую версию open-csv
уже является зависимостью в моем проекте, и, вероятно, это заставляет вторую библиотеку (LIB
) используйте эту старую версию open-csv
библиотека, которая не содержит более новый класс, используемый LIB
.
Я решил проблему обновлением версии open-csv
в моем основном списке зависимостей проекта.
В моем случае я забыл запустить Eclipse с параметром -vm, который должен указывать на jdk/javaw.exe.
Даже после 5 лет программирования на Java EE вы все равно допускаете ошибки...