Как переименовать цели в Maven?

В документе 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 ответа

Решение

Как я могу изменить название цели, например, на 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).

Я думаю, что есть вероятность, что в документации есть опечатка. Цели плагина определяются 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. Лучший способ узнать, какие цели определяет плагин и с какими этапами они связаны по умолчанию, - это прочитать документацию к плагину.

Как я могу изменить название цели, например, на 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>

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

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