Ответ 1
В итоге я написал свой собственный плагин, который использует mojo-executor для вызова других моджо. Это позволяет мне: 1) централизовать конфигурацию сборки и 2) минимизировать объем конфигурации, который дублируется в каждом из дочерних проектов.
(Если вам интересно узнать причину всего этого: каждый дочерний проект - это задание, которое будет выполняться из командной строки. Строка устанавливает оболочку invoker script и присоединяет ее к поэтому он будет проверен в нашем репозитории артефактов. Развертывание script позже вытащит их на машину, на которой они будут работать.)
Соответствующие части шаблона project pom:
<project ...>
<parent> ... </parent>
<artifactId>job-template</artifactId>
<packaging>pom</packaging>
<name>job project template</name>
<build>
<pluginManagement>
<plugin>
<groupId>...</groupId>
<artifactId>job-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-sources-step</id>
<goals><goal>job-generate-sources</goal></goals>
</execution>
<execution>
<id>package-step</id>
<goals><goal>job-package</goal></goals>
</execution>
... (a couple more executions) ...
</executions>
</plugin>
</pluginManagement>
</build>
</project>
Пришлось создать новый проект maven-plugin (job-maven-plugin). Pom выглядит так:
<project ...>
<parent> ... </parent>
<artifactId>job-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<name>job maven executor plugin</name>
<dependencies>
<dependency>
<groupId>org.twdata.maven</groupId>
<artifactId>mojo-executor</artifactId>
<!-- version 1.5 supports Maven 2, while version 2.0 only supports Maven 3 -->
<version>1.5</version>
</dependency>
</dependencies>
</project>
Как вы можете видеть из проекта шаблона, в моем плагине было несколько моджо (по одной на фазу, в которой нуждались вещи). В качестве примера, mojo-пакет заданий связан с фазой пакета и использует библиотеку mojo-executor для запуска двух других mojos (которые просто присоединяют некоторые артефакты сборки):
/**
* @goal job-package
* @phase package
*/
public class PackageMojo extends AbstractMojo {
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
protected MavenProject project;
/**
* @parameter expression="${session}"
* @required
* @readonly
*/
protected MavenSession session;
/**
* @component
* @required
*/
protected PluginManager pluginManager;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
ExecutionEnvironment environment = executionEnvironment(project, session, pluginManager);
// Attach script as a build artifact
executeMojo(
plugin(
groupId("org.codehaus.mojo"),
artifactId("build-helper-maven-plugin"),
version("1.7")
),
goal("attach-artifact"),
configuration(
element("artifacts",
element("artifact",
element("file", "${project.build.directory}/script.shl"),
element("type", "shl")
)
)
),
environment
);
// Zip up the jar and script as another build artifact
executeMojo(
plugin(
groupId("org.apache.maven.plugins"),
artifactId("maven-assembly-plugin"),
version("2.3")
),
goal("single"),
configuration(
element("descriptors",
element("descriptor", "${project.build.directory}/job/descriptor.xml")
)
),
environment
);
}
}
Затем, в дочерних проектах, я просто должен ссылаться на плагин один раз. На мой взгляд, это намного предпочтительнее повторения каждого из закулисных плагинов в каждом дочернем проекте (что неприемлемо увеличивает связь между порами). Если я хочу добавить выполнение mojo в процедуру сборки в будущем, мне нужно только изменить одно место и набросить номер версии. Детский проект pom выглядит следующим образом:
<project ...>
<parent>
<groupId> ... </groupId>
<artifactId>job-template</artifactId>
<version> ... </version>
<relativePath>../job-template</relativePath>
</parent>
<artifactId>job-testjob</artifactId>
<name>test job</name>
<build>
<plugins>
<plugin>
<groupId> ... </groupId>
<artifactId>job-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Кроме того, теперь структура всего многомодального каталога выглядит следующим образом:
+- job
+- job-core
+- job-maven-plugin
+- job-template
+- job-testjob1 (inherits from job-template)
+- job-testjob2 (inherits from job-template)
На мой взгляд, это решение не совсем оптимально, так как теперь у меня теперь есть плагиновая конфигурация, встроенная в серию mojos вместо pom, но она отвечает моим целям для централизации конфигурации и минимизации дублирования среди дочерних проектов poms.
(последнее примечание: я только что обнаружил maven-aggregate-plugin, который, похоже, позволяет группировать несколько плагинов в pom. Это, возможно, решило проблему в немного более желательным образом, но я не в настроении повторить последние несколько часов работы. Возможно, это будет полезно для кого-то еще.)