Java Maven MOJO - получение информации из проекта POM
Я работаю над плагином maven. Кажется, мне сложно понять, что было бы хорошим способом получить информацию POM от проекта, в котором вы выполняете MOJO?
Например, если я выполняю мой mojo в другом проекте maven, я хотел бы получить имя проекта или некоторые другие параметры.
И еще одна вещь: есть контекстный MAP в классе AbstractMojo.java, есть приватная Map pluginContext, может кто-то исправить меня, если я ошибаюсь, но это предполагается использовать для передачи информации между mojos?
Ответы
Ответ 1
Вы можете ввести текущий проект maven в свой mojo с полем, объявленным следующим образом:
/**
* @parameter default-value="${project}"
* @required
* @readonly
*/
MavenProject project;
Затем имя проекта можно просто вызвать project.getName()
.
Чтобы использовать этот API, вам нужно добавить артефакт maven-project
в качестве зависимости:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0.6</version>
</dependency>
Ответ 2
@Component
private MavenProject project;
также работает (более лаконично и интуитивно) при использовании нового maven-plugin-annotations
, который по умолчанию используется для новых mojos, созданных из maven-archetype-plugin
.
РЕДАКТИРОВАТЬ (спасибо @bmargulies): хотя @Component
Javadoc с 3.2 предлагает использовать его для MavenProject
, по-видимому, он устарел и предложение отклонено с 3.3; идиома, предложенная maven-plugin-tools-annotations
(начиная с 3.3), является чем-то вроде этого (оба, похоже, работают):
@Parameter(defaultValue="${project}", readonly=true, required=true)
private MavenProject project;
Ответ 3
Предпочитаемый синтаксис теперь:
@Parameter(defaultValue = "${project}", required = true, readonly = true)
MavenProject project;
Вам нужно добавить зависимость для maven-project
к вашему плагину pom:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0.6</version>
</dependency>
(Спасибо другим, которые уже предоставили эту информацию. Этот ответ объединяет их в одном месте.)