2013-06-18 3 views
4

У меня есть мультимодульный проект maven, который я не могу скомпилировать. У меня есть репозиторий Nexus, сидящий в моей локальной сети, и он работает (IntelliJ Idea может разрешать мои зависимости, которые находятся только в этом репозитории), и я создаю Jetbrains TeamCity. Я достаточно уверен, что TeamCity работает с тех пор, как несколько других конфигураций сборки, которые я установил, все еще работают (используя тот же параметр settings.xml). Я немного потеряю то, что может вызвать проблему. Вот мои POM файлы:Maven Multi-Module Project, не разрешающие зависимости

Родителя П:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.company.product.plugins</groupId> 
    <artifactId>plugin-parent</artifactId> 
    <version>1.2-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>product-wireless-plugin</module> 
     <module>product-paging-plugin</module> 
    </modules> 

    <distributionManagement> 
     <repository> 
      <id>releases</id> 
      <url>http://192.168.2.192:8081/nexus/content/repositories/releases/</url> 
     </repository> 
     <snapshotRepository> 
      <id>snapshots</id> 
      <url>http://192.168.2.192:8081/nexus/content/repositories/snapshots</url> 
     </snapshotRepository> 
    </distributionManagement> 

    <pluginRepositories> 
     <pluginRepository> 
      <id>autoincrement-versions-maven-plugin</id> 
      <name>autoincrement-versions-maven-plugin</name> 
      <url>http://autoincrement-versions-maven-plugin.googlecode.com/svn/repo</url> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </pluginRepository> 
    </pluginRepositories> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>autoincrement-versions-maven-plugin</artifactId> 
       <version>2.0-SNAPSHOT</version> 
       <executions> 
        <execution> 
         <id>update-pom-versions</id> 
         <goals> 
          <goal>increment</goal> 
          <goal>commit</goal> 
         </goals> 
         <phase>compile</phase> 
         <configuration> 
          <autoIncrementVersion>true</autoIncrementVersion> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <testFailureIgnore>true</testFailureIgnore> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

продукта беспроводного П:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <parent> 
     <artifactId>plugin-parent</artifactId> 
     <groupId>com.company.product.plugins</groupId> 
     <version>1.2-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.company.product.plugins</groupId> 
    <artifactId>product-wireless-plugin</artifactId> 
    <version>0.1.2</version> 

    <distributionManagement> 
     <repository> 
      <id>releases</id> 
      <url>http://192.168.2.192:8081/nexus/content/repositories/releases/</url> 
     </repository> 
     <snapshotRepository> 
      <id>snapshots</id> 
      <url>http://192.168.2.192:8081/nexus/content/repositories/snapshots</url> 
     </snapshotRepository> 
    </distributionManagement> 

    <dependencies> 
     <dependency> 
      <groupId>com.company.product</groupId> 
      <artifactId>product-common</artifactId> 
      <version>0.9.1</version> 
     </dependency> 
    </dependencies> 

</project> 

продукта-пейджинг П:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <parent> 
     <artifactId>plugin-parent</artifactId> 
     <groupId>com.company.product.plugins</groupId> 
     <version>1.2-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.company.product.plugins</groupId> 
    <artifactId>product-paging-plugin</artifactId> 
    <version>0.1.2</version> 

    <distributionManagement> 
     <repository> 
      <id>releases</id> 
      <url>http://192.168.2.192:8081/nexus/content/repositories/releases/</url> 
     </repository> 
     <snapshotRepository> 
      <id>snapshots</id> 
      <url>http://192.168.2.192:8081/nexus/content/repositories/snapshots</url> 
     </snapshotRepository> 
    </distributionManagement> 

    <dependencies> 
     <dependency> 
      <groupId>com.company.product</groupId> 
      <artifactId>product-common</artifactId> 
      <version>0.9.1</version> 
     </dependency> 
    </dependencies> 

</project> 

И ошибка я получаю это:

com.company.product.plugins: product-wireless-plugin [13:54:16] [com.company.product.plugins: product-wireless-plugin] Импорт данных из C:/TeamCity/buildAgent/work /40ac813105cf8bd7/product-wireless-plugin/target/surefire-reports/TEST-*.xml 'с процессором «surefire» [13:54:16] [com.company.product.plugins: product-wireless-plugin] Surefire Report Watcher [13:54:16] [com.company.product.plugins: product-wireless-plugin] Скачивание: repolocation/nexus/content/groups/public/com/company/product/product-parent/0.9.0 /product-parent-0.9.0.pom [13:54:16] [com.company.product.plugins: product-wireless-plugin] Не удалось выполнить цель в проекте product-wireless-plugin: не удалось разрешить зависимости для project com.company.product.plugins: product-wireless-plugin: jar: 0.1.2: Не удалось собрать зависимости для [com.company.prod uct: product-common: jar: 0.9.1 (компиляция)]

Я нахожусь в затруднительном положении, пытаясь отладить это ... есть ли у кого-нибудь предложения?

+0

1) Для этой ошибки «не удалось разрешить зависимости», есть почти всегда более подробное сообщение об ошибке и/или stacktrace ранее в журнале сборки. 2) Повторно запустите сборку с флагом '-X'. – noahlz

+0

@noahlz Если бы вы могли написать свой комментарий в качестве ответа, я согласен с ним. Мне удалось найти проблему, используя этот метод отладки. –

ответ

7

Существует несколько подходов/инструментов для устранения этой проблемы.

  1. Для этой ошибки «не удалось разрешить зависимости», есть почти всегда более подробное сообщение об ошибке и/или StackTrace ранее в журнале сборки. Журналы Maven на самом деле чрезвычайно подробные, с точки зрения поиска сообщения об ошибке «root» несколько экранов от сбоя сборки.

  2. Повторно запустите сборку с флагом -X. Вот documentation of Maven command line switches

  3. Другой вариант - использовать mvn dependency:tree для проверки полного графика транзитивных зависимостей. mvn help:effective-pom это еще один полезный инструмент, который печатает pom.xml после рассмотрения вашего settings.xml, любые активные профили и т.д. Аналогично mvn help:active-profiles

0

В вашей многомодульной сборке много проблем. Наиболее важным из них является то, что можно определить зависимость:

<dependencies> 
    <dependency> 
     <groupId>com.company.product</groupId> 
     <artifactId>product-common</artifactId> 
     <version>0.9.1</version> 
    </dependency> 
</dependencies> 

, который, казалось, либо не существующего в хранилище или нет доступа к хранилищу, который содержит его или ваша загрузка не удалось на основе какой-либо причине (может» я думаю!). Используете ли вы менеджера хранилища, например, Artifactory, Nexus, Archiva? Если нет, я рекомендую начать использовать его.

Помимо этого вы используете различные версии для родителей и модуль в беспроводном-модуле:

<parent> 
     <artifactId>plugin-parent</artifactId> 
     <groupId>com.company.product.plugins</groupId> 
     <version>1.2-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.company.product.plugins</groupId> 
    <artifactId>product-wireless-plugin</artifactId> 
    <version>0.1.2</version> 

мульти модуль сборка должна определить версию только через родитель и не внутри артефакта, что означает приведенное выше должно выглядеть так:

<modelVersion>4.0.0</modelVersion> 
<parent> 
    <artifactId>plugin-parent</artifactId> 
    <groupId>com.company.product.plugins</groupId> 
    <version>1.2-SNAPSHOT</version> 
</parent> 

<groupId>com.company.product.plugins</groupId> 
<artifactId>product-wireless-plugin</artifactId> 

Модуль не должен определять версию, потому что она наследует ее от родителя. Кроме того, вы можете видеть, что у вас есть модуль, который определяет версию выпуска (1.2), в то время как родительский определяет версию SNAPSHOT. Разработанное приложение/модули должно определить версию, которая является версией SNAPSHOT, которая означает вещь, как 1.2-SNAPSHOT и т. Д.

То же самое относится к определению распределения управления. Это должно быть определено только один раз в родительском проекте.

BTW. Если у вас есть несколько проектов, лучше всего определить родительскую компанию, которая содержит некоторые определения по умолчанию, такие как distributionManagement, pluginManagement, dependencyManagement и т. Д.

+0

Я не согласен с вами в отношении версии, которая должна быть одинаковой между детьми и родителями, поскольку это было причиной моей проблемы. В библиотеке «продукт-общий» есть родительский pom. Я сохранил основные номера версий в синхронизации между родительским помпом и всеми детьми. Однако иногда мне нужно будет опубликовать обновление для одной из дочерних программ (младшая версия), чтобы исправить ошибку, и приращение версии всех дочерних библиотек родителя не имело бы никакого смысла. Каскадные номера версий. Если у меня есть номер версии в дочернем помпе, он переопределяет версию в родительском. –

+0

Кроме того, нижний предел был за неправильное чтение вопроса, поскольку в вопросе упоминался мой репозиторий Nexus и тот факт, что библиотека решает через мое репо. –

2

Хорошо, я решил проблему благодаря вводу от @noahlz. После использования флага -X для отладки моей сборки я обнаружил, что родительский pom «product-common» (product-parent) не может быть найден. После просмотра моего репозитория Sonatype Nexus я обнаружил, что моя система сборки только публиковала новые версии родительского помпа, когда к нему были добавлены новые модули. Итак, хотя мой родительский pom находился на версии 0.9.0, у репозитория была последняя версия как 0.6.1. Я полагаю, что библиотека «общий продукт» компилировалась правильно, потому что она имела доступ к родительскому pom (с номером версии 0.9.0) во время компиляции. В любом случае, изменение родительской версии pom в «общем продукте», чтобы указать на самое последнее в репозитории, разрешило мои проблемы сборки с моими плагинами.

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