Maven не может обнаружить проекты рабочей области, junit, другие библиотеки

поэтому я начал использовать maven (с eclipse и локальной реализацией Sonatype) не так давно, после того, как я прошел через первоначальную боль, хотя все работало... видимо, нет!

У меня есть основной проект POM и все мои дочерние POM (я использую «плоскую» иерархию, поэтому все подпроекты находятся в той же папке, что и родительский POM). Кажется, это работает нормально.

Подпроект, в котором все началось, «выпущено» и протестировано до того, как я начал использовать Maven. Я пошел к maven, чтобы решить свои проблемы с "зависимостями"... или, скорее, сделать их более сложными в этом случае.

Большая часть материала «Maven», похоже, работает нормально, но я не могу разрешить зависимости моих «подпроектов», которые были выпущены в мой локальный ms/repository.

Каждый день я запускаю eclipse и сталкиваюсь с одними и теми же проблемами, у меня «невозможно разрешить импорт» во всех моих личных библиотеках и во всех тех, которые я использую для них (например, Log4j, DDlUtils и т. д.).

Я думал, что весь смысл maven в том, что я смогу поместить объявление импорта для библиотеки, добавить «groupID» и другие вещи в дочерний POM (или родительский POM). А затем автоматически загрузите все jar-файлы, когда я запускаю mvn install против родителя.

Однако каждый день я обнаруживаю, что мне приходится повторно вставлять путь сборки к библиотекам (внутренним и внешним) через рабочее пространство eclipse и указывать им расположение библиотек, которые я скачал, поскольку maven не может найти их нигде.

В частности, при запуске теста Junit я могу запустить их из рабочей области (используя запуск от имени junit), и все они проходят нормально. Но если я попытаюсь запустить их с помощью теста mvn, я получу сообщение о том, что java.lang; NoClassDefFoundError: org/junit/Assert (и это то же самое, что и внутри eclipse, выполняющего тест mvn, или из CLI) с сообщением об ошибке на выходе. из не удалось выполнить цель org.apache.maven.plugins:maven.surfire-plugin:2.10:проверьте, что POM и jar находятся в моем M2_REPO, и я могу найти его, когда я ищу в sonatype, почему maven не может найти что-то, что является частью собственной системы, существует в своем репо.

но это, очевидно, отлично работает, когда я запускаю eclipse и указываю его на независимо загруженную библиотеку junit.

Я не знаю, какая дополнительная информация вам может потребоваться, и мне явно чего-то не хватает либо в плагине m2e, либо в моей установке maven, либо в sonatype.

пожалуйста, помогите, у меня начинают выпадать волосы! и вскоре может быть вынужден вернуться к решению ant/ivy (но не хочу изучать «еще один инструмент» (в данном случае ivy).

заранее спасибо

Дэйвид.

пс. я на платформе Windows XP

редактировать... могу ли я заставить maven собрать и выпустить jar и pom, даже если он думает, что не проходит тесты (это не так, поскольку я делаю их вручную, и они проходят очень хорошо).

Если я посмотрю на вкладку «эффективный POM» моего родительского POM, указанного выше плагина там нет. Я предполагаю, что это означает, что это параметр конфигурации maven, но где его добавить и почему он не выполняется автоматически, когда я запускаю свой первый набор тестов maven?

редактировать 2....

Я только что нашел это на странице комментариев плагина apache (http://maven.apache.org/plugins/maven-surefire-plugin/plugin-info.html), поэтому я запустил код в CLI, mvn surefire:help - Ddetail=true -Dgoal=test было загружено много материала, и теперь тесты выполняются, но они терпят неудачу в maven? (помните, что они проходят при запуске из eclipse, используя «запуск от имени теста junit»)... так что это почти решение...


person DaveM    schedule 05.06.2012    source источник
comment
mvn surefire:help -Ddetail=true -Dgoal=тест   -  person DaveM    schedule 05.06.2012


Ответы (2)


Похоже, вам нужно, чтобы eclipse знал, что рассматриваемые проекты являются проектами Maven. У вас могут быть настроены POM для ваших проектов, но для работы плагина m2e вам необходимо либо создать проект как проект Maven («Новый» -> «Проект...» -> «Maven» -> «Maven Project...») или преобразовать его в проект Maven, щелкнув его правой кнопкой мыши и выбрав «Настроить» -> «Преобразовать в проект Maven». Вы узнаете, что проект был признан проектом Maven, потому что в левом верхнем углу его значка будет маленькая синяя буква «М», как показано на снимке экрана ниже:

Некоторые проекты затмения Maven

Главное, что следует отметить на картинке выше, — это библиотека Maven Dependencies. Это настраивается автоматически плагином m2e. Всякий раз, когда вы добавляете зависимость в POM, путь сборки проекта будет настроен автоматически, хотя иногда вам может потребоваться принудительно сделать это, щелкнув проект правой кнопкой мыши и выбрав «Maven» -> «Обновить конфигурацию Maven». Важно то, что если все работает, вам никогда не придется самостоятельно обновлять путь сборки. Кроме того, если вы обновите его самостоятельно, любые внесенные вами изменения, скорее всего, будут перезаписаны при следующем запуске команды «Обновить конфигурацию Maven».

Также стоит отметить на картинке, что две зависимости «mavenProjectTest» и «primes» имеют значки папок рядом с ними. Это означает, что они были выбраны в качестве проектов рабочей области. Чтобы это работало, в проекте должно быть включено «разрешение рабочей области», а проекты, которые нужно выбрать, также должны быть настроены как проекты m2e Maven.

Вы упоминаете о загрузке внешних библиотек. Вам не нужно загружать какие-либо библиотеки самостоятельно - добавив правильное объявление зависимости для внешней библиотеки, Maven загрузит ее из настроенного вами удаленного репозитория (в любом случае в первый раз - после этого он сможет получить ее из вашего локального репозитория. ). По умолчанию это репозиторий Maven Central. Чтобы добавить внешнюю библиотеку в свой проект, просто перейдите по этой ссылке, введите библиотеку в поле поиска, щелкните ссылку версии для нужной вам версии, затем вы попадете на страницу, где будет декларация XML-зависимости, которую вы можно просто скопировать и вставить в свой POM.

Еще одна вещь, которая может помочь, заключается в том, что вы должны убедиться, что ваши исходные папки соответствуют структуре каталогов Maven по умолчанию. То есть ваши тестовые пакеты должны находиться в исходной папке с именем «src/test/java», а основные пакеты проекта должны находиться в «src/main/java». В противном случае Maven не будет знать, где найти ваш исходный код. Можно настроить POM, чтобы сообщить Maven, что ваш исходный код должен находиться в разных исходных папках, но настоятельно рекомендуется следовать стандартной структуре каталогов Maven.

Поскольку у вас есть дочерние модули, я предлагаю упростить ситуацию, создав новый проект Maven с нуля, с которым вы можете поиграть. Как только вы освоитесь с этим, попробуйте заставить m2e работать для вашего многомодульного проекта.

Я помню вашу боль, когда вы впервые столкнулись с Maven, но это здорово, когда вы понимаете, что он делает, и все работает. Я настоятельно рекомендую прочитать бесплатную онлайн-книгу Maven: The Complete Reference - это очень помогло мне, когда я только начинал работать с Maven.

person Robert Johnson    schedule 06.06.2012
comment
Поэтому мне нужно попробовать еще раз с новым проектом, а затем просто скопировать все мои классы из моего текущего материала. Я проверю это, когда у меня будет шанс, и настрою его как единый проект с правильной «дочерней» древовидной структурой (а не плоской), поскольку Eclipse, похоже, предпочитает это. Как только я его протестирую (и он заработает, я отмечу ваш ответ как решение... дайте ветке удар, если я забуду. Пока что я вернулся к ANT (возможно, я попробую плющ с ним ?) Дэйвид - person DaveM; 06.06.2012
comment
В конце концов, вам повезло с Maven? - person Robert Johnson; 23.06.2012
comment
Я как бы дал Мэйвену локоть. Я пытался загрузить исходный код нескольких проектов, и установка с помощью maven даже с ними не удалась (что кажется странным). У меня действительно не было времени, чтобы полностью исследовать. Однако я решил использовать структуру файлов/папок maven, поэтому, когда я буду готов, я смогу скопировать файлы в полноценный тестовый проект. Однако сейчас я буду придерживаться ANT (что приводит к довольно длинному списку jar в моем пути к классам манифеста, поскольку я получаю список динамически и использую один и тот же код для всех своих проектов, грязный, но быстрее). Я думаю попробовать Айви? - person DaveM; 22.08.2012

Я получил те же сообщения и нашел рабочее решение благодаря одному из экспертов Maven в моей организации.

Вот мой pom.xml, который воспроизводит вашу ошибку:

  <dependencies>
    <dependency>
        <groupId>org.junit4</groupId>
        <artifactId>org.junit4</artifactId>
        <version>4.3.1</version>
    </dependency>
  </dependencies>

С ним я получу package org.junit does not exist сообщений и NoClassDefFoundError: org/junit/Assert. Подобно вашему опыту, он отлично работал с Eclipse, зелеными полосами и всем остальным.

Вот pom.xml, который работает:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Я скопировал это из примера в верхней части этого раздела. Использование страницы JUnit< /а>.

person rajah9    schedule 21.08.2012