Maven зависимости Groovy

Я управляю проектом, который зависит от groovy 1.7-beta-1. Плагин gmaven использует отличную версию 1.6 в качестве зависимости. В моем pom я указываю в разделе управления зависимостями версию grooyv-all как:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>1.7-beta-1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Тем не менее, когда я запускаю maven в режиме отладки, я вижу, что groovy 1.6 используется для зависимости от плагина gmaven. Я думал, что мой раздел управления зависимостями переопределит это, так что все они используют 1.7-бета-1, но я получаю ошибки из-за разных версий groovy. любая помощь здесь будет оценена.

Спасибо,

Джефф

4 ответа

Решение

Вот уточненная версия ответа Паскаля. Я обновил версию основного плагина до 1.2, зависимость от Groovy 1.7, и обернул все это в тег pluginManagement, чтобы он мог эффективно использовать модель наследования.

Имейте в виду, что 1.3-SNAPSHOT плагина GMaven уже начал использовать провайдера 1.7-rc2 Groovy.

<!-- I wrapped everything in a plugin management section so that this can be neatly inherited across all your poms -->
<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.codehaus.gmaven</groupId>
      <artifactId>gmaven-plugin</artifactId>
      <!-- Notice I upgraded it to 1.2 -->
      <!-- Details here http://repo1.maven.org/maven2/org/codehaus/gmaven/gmaven-plugin/1.2/gmaven-plugin-1.2.pom -->
      <version>1.2</version>
      <dependencies>
        <dependency>
          <groupId>org.codehaus.gmaven.runtime</groupId>
          <artifactId>gmaven-runtime-1.7</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</pluginManagement>

Переопределение зависимости, используемой плагином, - хорошая возможность, которая была фактически введена в Maven 2.0.9.

Для этого, по крайней мере, с плагином, который вы используете как обычный плагин сборки, в отличие от отчета, который не относится к gmaven-plugin поэтому я не буду описывать этот случай здесь - просто добавьте блок зависимостей внутри блока плагина, например так (это пример, поэтому версии могут быть неточными):

<plugin>
  <groupId>org.codehaus.groovy.maven</groupId>
  <artifactId>gmaven-plugin</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <goals>
        <goal>generateStubs</goal>
        <goal>compile</goal>
        <goal>generateTestStubs</goal>
        <goal>testCompile</goal>
      </goals>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy-all</artifactId>
      <version>1.7-beta-1</version>
    </dependency>
  </dependencies>
</plugin>

Пока новая версия зависимости "API-совместима" с версией, с которой был связан плагин, у вас все должно быть в порядке. Если нет, то вам, очевидно, придется перейти на более новую версию плагина, совместимого с новым API (то есть, скорее всего, используя его в качестве зависимости), что вы и сделали.

Чтобы gmaven точно выбирал правильное время выполнения, нужно настроить значение "providerSelection", например:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
             <configuration>
                 <providerSelection>1.7</providerSelection>
             </configuration>

К вашему сведению, для groovy:providers mojoэто конфигурации, которые он ожидает (я извлек их путем отладки в org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(List, Stack, MavenSession, MavenProject) (Ищу XmlPlexusConfiguration):

<configuration>
 <remoteRepositories implementation="java.util.List">${project.pluginArtifactRepositories}</remoteRepositories>
 <project implementation="org.apache.maven.project.MavenProject">${project}</project>
 <artifactRepository implementation="org.apache.maven.artifact.repository.ArtifactRepository">${localRepository}</artifactRepository>
 <pluginArtifactMap implementation="java.util.Map">${plugin.artifactMap}</pluginArtifactMap>
 <providerSelection implementation="java.lang.String">${gmaven.runtime}</providerSelection>
</configuration>

Вам необходимо добавить аналогичную зависимость 1.7 к зависимостям плагина в аналогично структурированной <plugin> или же <pluginManagement> раздел. Ваш раздел управления зависимостями, который вы добавляете, корректен, но не влияет на зависимости плагина. Я постараюсь просмотреть этот ответ и опубликовать пример позже, когда вернусь за свой стол.

Другие вопросы по тегам