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 вы все равно допускаете ошибки...

Другие вопросы по тегам