Как переименовать цели в 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>
...
У меня есть несколько вопросов, касающихся этого плагина:
Как я могу изменить название цели, например, на
foo:bar
? (Почему ниdisplay
ниtime
появиться где-нибудь во фрагменте XML? Как вы можете, глядя на фрагмент, определить, какие цели он определяет?)Как я могу вручную запустить эту цель? (Для аналогичных конструкций эквивалент
mvn display:time
иногда работает, но это не работает последовательно.)Как я могу увидеть, существует ли эта цель? (то есть список доступных целей; этот вопрос предполагает, что это невозможно.)
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
,
Насколько я знаю, невозможно переименовать maven целей. (Похоже, это только усложнит ситуацию.) Исходный код плагина определяет цели, а не pom. Тег
в pom просто позволяет вам привязать цели плагина к фазам или перепривязать цели, если у них уже есть фаза по умолчанию. Вы должны быть в состоянии запустить цель с
prefix:goalName
, Чаще всего префикс - это просто то, что находится между "maven-" и "-plugin" в artifactId. напримерtouch:timestamp
, Это сложно в некоторых ситуациях, так как авторы плагинов могут указать "goalPrefix", отличное от имени плагина, но у меня никогда не возникало проблем с этим.Лучший способ узнать, какие цели определяет плагин и с какими этапами они связаны по умолчанию, - это прочитать документацию к плагину.
Как я могу изменить название цели, например, на 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). К третьему: обычно следует использовать плагин справки, чтобы взглянуть на документы.