Как переименовать цели в Maven? - PullRequest
9 голосов
/ 29 апреля 2010

В документе Maven Введение в жизненный цикл сборки описана цель display:time, которая выводит текущее время. Плагин выглядит следующим образом:

...
<plugin>
  <groupId>com.mycompany.example</groupId>
  <artifactId>maven-touch-plugin</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>process-test-resources</phase>
      <goals>
        <goal>timestamp</goal>
      </goals>
    </execution>
  </executions>
</plugin>
...

У меня есть несколько вопросов, касающихся этого плагина:

  1. Как я могу изменить название цели, например, foo:bar? (Почему ни display, ни time нигде не фигурируют во фрагменте XML? Как вы можете определить, глядя на фрагмент, какие цели он определяет?)

  2. Как я могу вручную выполнить эту цель? (Для аналогичных конструкций иногда работает эквивалент mvn display:time, но это не работает согласованно.)

  3. Как узнать, существует ли эта цель? (то есть список доступных целей; этот вопрос предполагает, что это невозможно.)

Ответы [ 4 ]

11 голосов
/ 29 апреля 2010

Как я могу изменить название цели, например, foo:bar? (Почему ни display, ни time нигде не фигурируют во фрагменте XML? Как вы можете, глядя на фрагмент, определить, какие цели он определяет?)

Если быть точным, в foo:bar, foo - это «префикс цели плагина», а bar - «цель». И хотя последнее основано на соглашениях об именах (или может быть сконфигурировано 1 ), первое происходит из аннотации BarMojo, класса, который реализует логику плагина. Примерно так:

/**
 * Do the wonderful bar.
 * @goal bar
 * @requiresProject false
 */
public class BarMojo extends AbstractMojo
{
    ...
}

Для изменения цели требуется изменить аннотацию mojo плагина и перестроить его.

Что касается документации, на которую вы ссылаетесь, существует явное несоответствие между целью time и фрагментом XML, которая связывает цель timestamp с фазой process-test-resources. Это должно быть опечатка.

Как я могу вручную запустить эту цель? (Для аналогичных конструкций эквивалент mvn display: время иногда работает, но это не работает последовательно.)

Вы можете назвать это так:

mvn com.mycompany.example:maven-touch-plugin:1.0:timestamp

Вы можете сделать эту команду короче, добавив com.mycompany.example к группам плагинов в ваших settings.xml (org.apache.maven.plugins и org.codehaus.mojo объявлены по умолчанию, если вам интересно, как она работает для этих плагинов)

<settings>
  ...
  <pluginGroups>
    <pluginGroup>com.mycompany.example</pluginGroup>
  </pluginGroups>
</settings>

Тогда, поскольку имя плагина соответствует шаблонам ${prefix}-maven-plugin или maven-${prefix}-plugin, вы можете выполнить:

mvn touch:timestamp 

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

Как узнать, существует ли эта цель?

Проверьте документацию плагина (полученную из источников плагина) или источников плагина.


1 Обратите внимание, что в нижней части упомянутой страницы Книги Maven также есть опечатка. Способ выполнения плагина с пользовательским префиксом должен быть mvn blah:echo (см. MVNREF-145 ).

2 голосов
/ 29 апреля 2010

Я думаю, что есть вероятность, что в документации есть опечатка. Цели плагина указаны plugin-name:goal-name. Этот XML связывает цель touch:timestamp с фазой process-test-resources. Этот фрагмент не имеет ничего общего с display:time.

  1. Насколько я знаю, невозможно переименовать maven цели. (Похоже, это только усложнит ситуацию.) Исходный код плагина определяет цели, а не pom. Тег в pom позволяет вам просто привязать цели плагинов к фазам или перепривязать цели, если у них уже есть фаза по умолчанию.

  2. Вы должны быть в состоянии выполнить цель с prefix:goalName. Чаще всего префикс - просто то, что находится между «maven-» и «-plugin» в artifactId. например touch:timestamp. Это сложно в некоторых ситуациях, так как авторы плагинов могут указать «goalPrefix», отличное от имени плагина, но у меня никогда не возникало проблем с этим.

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

0 голосов
/ 30 января 2012

Как я могу изменить название цели, например, на foo: bar? (Почему ни фрагмент, ни время не отображаются нигде во фрагменте XML? Как вы можете, глядя на фрагмент, определить, какие цели он определяет?)

Чтобы изменить имя префикса на «foo», вам необходимо настроить плагин maven «plugin».

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
        <goalPrefix>foo</goalPrefix>
    </configuration>
    </plugin>

Чтобы изменить название цели, вам нужно отредактировать javadoc в плагине java source

/**
 * Prints a timestamp to console
 *
 * @goal bar
 */
public class TimestampMojo extends AbstractMojo {
  // ...
}

Добавьте префикс плагина в файл settings.xml

<pluginGroups>
  <pluginGroup>com.mycompany.example</pluginGroup>
</pluginGroups>

Как вручную выполнить эту цель?

mvn com.mycompany.example:foo:bar

или с настройкой префикса плагина (выше)

mvn foo:bar

Как узнать, существует ли эта цель? (то есть список доступных целей)

Добавьте следующее в плагин maven plugin, и вы можете использовать foo: help, чтобы распечатать список целей.

<plugin>
...
<executions>
<execution>
<id>generated-helpmojo</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
</executions>
</plugin>
0 голосов
/ 29 апреля 2010

к первому.Название цели определяется плагином (для этого есть аннотация).Если у вас есть исходный код, вы меняете его.Взглянув на XML, вы не можете знать, какие цели плагин определяет только те, которые приведены в XML.Лучшее место, чтобы посмотреть на документацию плагина.Второй: вы должны проверить документы.Обычно имя плагина: цель ... Может быть, вам нужно указать полный путь к плагину (groupId).К третьему: обычно должен иметь возможность использовать плагин справки, посмотрите на документы .

...