2010-05-26 3 views
29

Мой проект P зависит от зависимости A, которая зависит от зависимости B. Файл pom.xml моего проекта включает A как зависимость, а его jar включен в путь класса P. Тем не менее, есть NoClassDefFoundError, брошенный во время выполнения P, что проистекает из недостающих банок B.Maven. Транзитные зависимости

Разве Maven не загрузил эти зависимости автоматически?

ответ

20

Мой проект P зависит от зависимости A [с областью компиляции], которая зависит от зависимости B [с областью компиляции].

Если В не является optional dependency А, Б должна быть зависимость Р с «компилировать (*)» объем (см таблицу Dependency Scope и прочитать примечание) и должны, таким образом, будут доступны во время выполнения.

Тем не менее, во время выполнения P возникает проблема NoClassDefFoundError, которая возникает из-за отсутствия баннеров B.

Поскольку вы запускаете проект под Eclipse, путь к нему настроен для вас, поэтому я исключу ошибку на этом уровне. Это оставляет нам случай дополнительной зависимости.

PS: Очень полезный инструмент для исследования такого рода проблем - dependency:tree.

+1

Последнее предложение: представление иерархии зависимостей в m2eclipse намного удобнее, чем зависимость: tree, он даже дает вам мастер «exclude» –

+0

@seanizer: True (при условии, что OP использует m2eclipse). Обратите внимание, что ['dependency: tree'] (http://maven.apache.org/plugins/maven-dependency-plugin) также поддерживает [фильтрацию] (http://maven.apache.org/plugins/maven-dependency- плагин/примеры/фильтрация-The-зависимость-tree.html). –

+0

Я предполагаю, что любой, кто использует maven и eclipse вместе, также использует m2eclipse, поскольку он намного более мощный и удобный, чем maven-eclipse-plugin (редактор pom, индекс репозитория, автоматическая настройка конфигурации при редактировании pom и т. Д.). и, конечно, он также включает фильтрацию: нажмите на любой артефакт в иерархии, и показана только эта иерархия артефакта ... –

2

Если эта зависимость A имеет скомпилированную область - обязательно, она должна быть загружена и более переделана в пути к классам проекта. Но если бы у него было , то предоставлено пространство, которое было бы так, поскольку предоставленные депиляции не были бы упакованы с приложением Maven.

Кстати, как вы выполняете этот проект - не работает должным образом, это может вызвать такие проблемы, и это очень хорошее предположение. Например, если вы используете maven exec plugin - maven будет правильно настроить путь к классам, но в противном случае - вы должны настроить его самостоятельно (или создать банку с зависимостями с помощью assembly plugin).

+0

А перечислены B, как зависимость с «компилировать» сферу; P перечисляет A как зависимость с областью «компиляции». B не добавляется в путь класса P. – Jake

+0

Вы не ответили на вопрос: «Как вы его используете?» – bmargulies

+0

@bmargulies Pardon. Я генерирую метаданные Eclipse и запускаю их из отладчика Eclipse. – Jake

-2

В моем случае я забыл запустить Eclipse с параметром -vm, который должен указывать на jdk/javaw.exe.

Даже после 5 лет Java EE программирования вы до сих пор делают Гринхорн ошибки ...

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