Как разрешить циклическую зависимость в дополнительном субмодуле Maven? - PullRequest
4 голосов
/ 21 декабря 2010

Существует многомодульный проект Maven-3, в котором один из подмодулей используется как <dependency> во всех остальных модулях.В то же время все подмодули наследуются от родительского модуля.Такая структура приводит к циклической зависимости.Как я могу решить это?

Структура проекта довольно типична:

/foo
  /foo-testkit
  /foo-core

Это родительский foo/pom.xml:

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
      <configuration>
        <configLocation>checkstyle/checks.xml</configLocation>
      </configuration>
      <dependencies>
        <dependency>
          <groupId>${project.groupId}</groupId>
          <artifactId>foo-testkit</artifactId>
          <version>${project.version}</version>
        </dependency>
      </dependencies>
      <executions>
        <execution>
          <phase>prepare-package</phase>
          <goals>
            <goal>check</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

В родительском foo/pom.xml Я указываюкак и когда плагин checkstyle должен выполняться в каждом подмодуле.Но мне не нужно, чтобы контрольный стиль выполнялся в foo-testkit, который является субмодулем, унаследованным от foo, но в то же время является зависимостью ..

Ответы [ 4 ]

4 голосов
/ 22 декабря 2010

Один из способов - отключить плагин checkstyle для модуля foo-testkit, добавив приведенное ниже в файл pom.xml foo-testkit.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-checkstyle-plugin</artifactId>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

Если вам это не нравится, другой способ -переместите конфигурацию плагина checkstyle из build / plugins в build / pluginManagment / plugins в родительском файле pom.xml.Затем в каждом модуле, который вы хотите выполнить checkstyle, добавьте его в раздел build / plugins файла pom.xml каждого модуля:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-checkstyle-plugin</artifactId>
</plugin>

Это вызывает плагин для этого модуля и конфигурацию, указанную в родительском pom.xml под разделом pluginManagement будет применен.Вы можете убедиться, что он работает правильно, запустив mvn help:effective-pom на этом модуле.

2 голосов
/ 22 декабря 2010

Я согласен с ответом Тима Клемонса , но есть и другой вариант, сделать ваш проект вложенным.

                       root
                     /       \
                 common    sub-root
                         /     |    \
                       sub1  sub2  sub3

Определить зависимость для common в sub-root pom,Я не говорю, что это лучшая практика, но это решение вашей проблемы.

1 голос
/ 21 декабря 2010

Итак, я так понимаю, родительский pom ссылается на один из подмодулей как на зависимость?Я хотел бы предложить, если у вас есть какая-либо логика сборки в родительском модуле, вы помещаете ее в новый подмодуль.Родитель должен ограничиться указанием разделов <modules>, <pluginManagement> и <dependencyManagement>.Вся остальная работа должна быть передана подмодулям.

Дополнительные советы по организации многомодульных проектов см. В следующих документах:

http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html

0 голосов
/ 22 декабря 2014

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

...