Создание Maven Mojo, автоматически добавляющего новые исходные папки в сборку - PullRequest
2 голосов
/ 05 декабря 2011

Я создал новый компилятор для maven-compiler-plugin.Этот компилятор любит искать исходники компиляции в src / main / groovy и src / main / java.Точно так же тестовые источники находятся как в src / test / groovy, так и в src / test / java.

Мне известно о build-helper-maven-plugin, который позволяет пользователям расширять свои pom для указания новых исходных папок для сборки, ноиспользование этого плагина не является идеальным, поскольку для него требуется более 20 строк дополнительной конфигурации в pom .

Я хотел бы создать mojo, который автоматически конфигурирует дополнительные исходные папки.

Вот моё создание, которое я создал, но я не знаю, как обеспечить выполнение этого исполнения в нужное время.

/**
 * @goal add-groovy-source
 * @phase generate-sources
 * @requiresDependencyResolution compile
 * @execute phase="compile"
 */
public class AddGroovySourceFolders extends AbstractMojo {
    /**
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;

    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("Adding /src/main/groovy to the list of source folders");
        this.project.addCompileSourceRoot(project.getBasedir() + "/src/main/groovy");
    }
}

Опять же, моя цель - обеспечить минимальный объем конфигурации в поме пользователя.Под этим я подразумеваю, что должно быть только объявление зависимости от плагина, который содержит это mojo и не требует дальнейшей конфигурации.

1 Ответ

2 голосов
/ 08 декабря 2011

Это возможно путем определения пользовательского жизненного цикла.

Шаг 1: Определите MOJO для добавления путей. Вы сделали это уже с AddGroovySourceFolders.

Шаг 2. Создайте файл META-INF/plexus/components.xml в src/main/resources:

<component-set>
    <components>
        <component>
            <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
            <role-hint>jar</role-hint>
            <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
            <configuration>
                <lifecycles>
                    <lifecycle>
                        <id>default</id>

                        <phases>
                            <!-- I added this one, use appropriate plugin groupId/artifactId instead-->
                            <initialize>groovyadd:maven-groovyadd-plugin:add-build-paths</initialize>
                            <process-resources>org.apache.maven.plugins:maven-resources-plugin:2.4.3:resources</process-resources>
                            <compile>org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile</compile>
                            <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:2.4.3:testResources</process-test-resources>
                            <test-compile>org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile</test-compile>
                            <test>org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test</test>
                            <package>org.apache.maven.plugins:maven-jar-plugin:2.3.1:jar</package>
                            <install>org.apache.maven.plugins:maven-install-plugin:2.3.1:install</install>
                            <deploy>org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy</deploy>
                        </phases>
                    </lifecycle>
                </lifecycles>
            </configuration>
        </component>
    </components>
</component-set>

Элемент указывает упаковку, для которой предназначен жизненный цикл. Очевидно, вы можете переопределить жизненный цикл jar (у меня это работает с Maven 3.0.3). Я скопировал все, кроме фазы инициализации, из соответствующего компонента в maven-core-3.0.3.jar \ META-INF \ plexus \ components.xml.

Побочным эффектом переопределения жизненного цикла JAR Maven является то, что вы теперь жестко запрограммировали версии компиляции и других плагинов, которые есть в вашем плагине, а не в Maven. Я не уверен, плохо это или хорошо.

Шаг 3: При использовании вашего плагина из другого проекта все, что вам нужно:

<plugins>
    ...
    <plugin>
        <groupId>groovyadd</groupId>
        <artifactId>maven-groovyadd-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <extensions>true</extensions>
    </plugin>
    ...
</plugins>

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

Вы также можете добавлять другие плагины к другим фазам жизненного цикла (например, компилировать Groovy-код на этапе компиляции в отдельный плагин вместо добавления компилятора для плагина maven-compiler-plugin).

Ссылки: Переопределение жизненного цикла по умолчанию из книги Maven

...