Управление версиями зависимостей Maven и java.lang.NoClassDefFoundError - PullRequest
4 голосов
/ 08 октября 2009

У меня есть проект Java X имеет зависимость (в файле pom) от проекта Y.

Я изменял в Y и собирал X, Y с помощью инструмента Maven, затем без проблем запустил X (на JBoss).

Когда я добавил новый класс в Y, затем построил с помощью Maven (без проблем), а затем запустил X, он выдает java.lang.NoClassDefFoundError для нового класса.

Я думаю, это версия Maven-зависимостей или что-то в этом роде ... Я искал в основном в Google, но ничего не помогло ... Как решить эту проблему ??

Ответы [ 6 ]

7 голосов
/ 08 октября 2009

Моро, вы написали в комментарии, что X имеет следующую объявленную зависимость:

<dependency>
  <groupId>Y</groupId>
  <artifactId>Y</artifactId>
  <scope>provided</scope>
  <version>1.0</version>
</dependency>

Первая точка. Вы используете «фиксированную» версию здесь (в отличие от «SNAPSHOT»). При использовании SNAPSHOT maven будет автоматически получать последние SNAPSHOT каждый раз, когда вы строите. С другой стороны, когда вы используете 1.0, когда maven скачал этот артефакт, он никогда не пытается получить новый 1.0. Таким образом, вы должны увеличить версию Y или, если Y находится в стадии активной разработки (улучшения, исправления ошибок и т. Д.), Вы действительно должны использовать SNAPSHOT. Для получения дополнительной информации о SNAPSHOT обратитесь к главе 9.3.1.2. SNAPSHOT Версии книги Сонатипа:

Зачем вам это использовать? СНАПШОТ версии используются для проектов под активное развитие. Если ваш проект зависит от программного компонента, который находится в стадии активной разработки, вы можете зависит от релиза SNAPSHOT, и Maven будет периодически пытаться загрузить последний снимок с хранилище при запуске сборки. Точно так же, если следующий выпуск вашего Система будет иметь версию «1.4», ваш проект будет иметь версия "1.4-SNAPSHOT" пока не было официально выпущен.

Второй пункт. Вы используете область действия provided. Согласно главе 9.4.1. Область зависимостей :

provided зависимости используются, когда Вы ожидаете, что JDK или контейнер предоставить им. Например, если вы были разрабатывая веб-приложение, вы потребуется доступный Servlet API на пути к классам для компиляции сервлет, но ты бы не хотел включить API сервлета в упакованная война; JAR сервлетного API предоставляется вашим сервером приложений или Контейнер сервлетов. provided зависимости доступны на classpath компиляции (не время выполнения). Они не являются переходными и не являются упаковывают.

Это действительно то, что вы хотите? Как вы развертываете X и Y на JBoss? Разве вы не должны использовать область по умолчанию compile?

0 голосов
/ 09 октября 2009

Хорошо, извините за позднюю информацию.

Пакетом X является ejb, поэтому у X.jar нет каталога lib.

Затем Y.jar должен быть помещен в Jboss / server / default / lib, он работает правильно.

Спасибо за все.

0 голосов
/ 08 октября 2009

Maven разрешает зависимости от локальных и удаленных репозиториев, хотя плагины IDE, такие как m2eclipse , также разрешают зависимости, являющиеся проектами в рабочей области. Если у вас нет такого плагина, вам нужно будет установить артефакт Y в локальный репозиторий или развернуть его в удаленном репозитории, чтобы вы и ваши коллеги могли получить к нему доступ до того, как Maven узнает, что при создании проекта было внесено изменение X.

снимок экрана с разрешением рабочего пространства http://docs.codehaus.org/download/attachments/11403480/project-properties.png

Если два проекта тесно связаны, вы можете рассмотреть возможность создания многомодульной сборки , чтобы проекты X и Y создавались одновременно.

0 голосов
/ 08 октября 2009

Пробовали ли вы mvn clean в проекте Y до его создания?

0 голосов
/ 08 октября 2009

Установили ли вы / развернули новую версию Y, обновили зависимости X для новой версии Y и пересобрали X?

0 голосов
/ 08 октября 2009

Вы запускали mvn install на Y после добавления нового класса?

...