Squeak.ru - шаблоны программирования

Профиль Maven - как запустить плагин один раз для родительского и несколько раз для модулей?

Я немного озадачен выводом Дженкинса.

Работа с Дженкинсом: (сокращенный pom.xml внизу)

mvn deploy -Pprofile1

Все мои плагины будут запускаться 4 раза:

  • родитель / pom.xml
  • родительский / модуль1 / pom.xml
  • родительский / модуль2 / pom.xml
  • родительский / модуль3 / pom.xml

Я нуждаюсь:

  • first-maven-plugin: запускать один раз в родительском pom.xml
  • second-maven-plugin: запускать для каждого pom.xml

Почему:

  • first-maven-plugin: будет работать синхронно: инициализация -> довольно долгая операция очистки. Не хочу этого 4 раза
  • second-maven-plugin: будет работать в фазе: package -> necesaary для всех pom.

Родительский pom.xml

<project ...>

    <groupId>com.test.parent</groupId>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>parent</name>

    <modules>
        <module>module1</module>
        <module>module2</module>
        <module>module3</module>
    </modules>

    <profiles>
        <profile>
            <id>profile1</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>com.test.plugin</groupId>
                        <artifactId>first-maven-plugin</artifactId>
                        <version>1.0.0-SNAPSHOT</version>
                        <execution>
                            <id>execution1</id>
                            <phase>initialize</phase>
                            <goals>
                                <goal>doit</goal>
                            </goals>
                        </execution>
                    </plugin>
                    <plugin>
                        <groupId>com.test.plugin2</groupId>
                        <artifactId>second-maven-plugin</artifactId>
                        <version>1.0.0-SNAPSHOT</version>
                        <execution>
                            <id>another</id>
                            <phase>package</phase>
                            <goals>
                                <goal>goforit</goal>
                            </goals>
                        </execution>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>

  • есть ли у этих двух плагинов какой-либо skip параметр? 25.03.2016
  • У плагинов нет опции пропуска. Они являются общими, поскольку могут работать в нескольких проектах. 25.03.2016

Ответы:


1

Сначала, если вы определяете плагин в родительском элементе, который наследуется всем дочерним элементам, он ведет себя именно так, как вы хотели, что означает, что он выполняется на каждом pom (или, другими словами, на каждом модуле, не имеет значения, является ли он дочерним или нет ).

Проблема ваших плагинов в том, что они не очень хорошо справляются со случаями использования. Потому что вы говорите, что первый first-maven-plugin должен работать только на корневом уровне (кроме этого, я не понимаю, что вы имеете в виду под операцией очистки ... удалением целевой папки?)

А второй плагин second-maven-plugin должен запускаться для всех pom'ов? Какую не очень точную причину вы имеете в виду под всеми дочерними модулями, имеющими упаковку pom? Но я полагаю, вы имеете в виду всех детей, у которых есть упаковка jar?

Помимо вышесказанного, я не уверен, что использование вашего профиля основано только на неправильной обработке вариантов использования.

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

Если вам нравится запускать плагин только на корневом уровне такой многомодульной структуры, с этим можно легко справиться в вашем плагине, например:

public void execute()
    throws MojoExecutionException, MojoFailureException
{

    if (mavenProject.isExecutionRoot()) {

    } else {

    }

 ..

Используя указанное выше, ваш плагин может решить, работает он на корневом уровне или нет.

Итак, ваш first-maven-plugin может использовать следующее:

public void execute()
    throws MojoExecutionException, MojoFailureException
{

    if (!mavenProject.isExecutionRoot()) {
       getLog().info("Not running at root level");
       return;  
    } 
    // here the time consuming operations        
 ..

И ваш second-maven-plugin сделать обратное:

public void execute()
    throws MojoExecutionException, MojoFailureException
{

    if (mavenProject.isExecutionRoot()) {
       getLog().info("Not running at root level");
       return;  
    } 
    // here the operation on the childs.
 ..

Поведение можно улучшить следующим образом:

public void execute()
    throws MojoExecutionException, MojoFailureException
{

    if (!mavenProject.isExecutionRoot()) {
       getLog().debug("Not running at root level");
       return;  
    } 

    if ("pom".equals(project.getPackaging())) {
        getLog().debug("Ignoring pom packaging.");
        return;
    }
    // ..now the operations you would like to do...

Поэтому, если у вас несколько уровней иерархии модулей, вы можете игнорировать pom части упаковки или другие части и т. Д.

И последний по порядку но не по значимости. Что делают ваши плагины в архиве?

25.03.2016

2

Вы можете использовать <inherited>false</inherited> в первой конфигурации плагина. Таким образом, он будет работать только при выполнении родительского pom.

<build>
    <plugins>
        <plugin>
            <groupId>com.test.plugin</groupId>
            <artifactId>first-maven-plugin</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <inherited>false</inherited>
            <execution>
                <id>execution1</id>
                <phase>initialize</phase>
                <goals>
                    <goal>doit</goal>
                </goals>
            </execution>
        </plugin>
        <plugin>
            <groupId>com.test.plugin2</groupId>
            <artifactId>second-maven-plugin</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <execution>
                <id>another</id>
                <phase>package</phase>
                <goals>
                    <goal>goforit</goal>
                </goals>
            </execution>
        </plugin>
    </plugins>
</build>

См. https://stackoverflow.com/a/1671175

22.09.2017
  • Почему это не утвержденный ответ? 31.07.2019
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...