Как выполнить другую цель для одного модуля проекта с несколькими модулями?

У меня есть проект, состоящий из двух разных модулей. Я не контролирую файлы pom этих модулей и поэтому не могу их изменить. Я полностью контролирую файл pom проекта. Идентификатор проекта, который не определен как родительский элемент в модулях.

Структура папки:

project
 + module1
 + module2

В рамках работы мне нужно выполнить две разные цели для обоих модулей, чтобы модуль1 был установлен в локальный репозиторий, но не module2. Это просто пример. Моя фактическая проблема содержит больше уровней с более чем 2-мя модулями на уровне.

Чтобы свести к минимуму конфигурацию, необходимую для моей CI-системы, я хочу запустить ее одним вызовом maven.

Я "мечтал" о чем-то вроде

mvn install -Dspecial=module:compile

Возможно ли это, и если да, то как это сделать?

Ответы

Ответ 1

(...) Чтобы свести к минимуму конфигурацию, необходимую для моей CI-системы, я хочу запустить ее в одном вызове maven.

Я боюсь, что это будет невозможно. Как я объяснил в этом ответе, фаза или цель, вызываемые как часть сборки нескольких модулей, запускаются против всех модулей.

Если вы хотите запустить другой этап или цель для подмножества подмодулей, вам придется дважды вызвать maven, возможно, используя опции --projects, -pl, чтобы выбрать правильное подмножество:

  • mvn -pl module1,module3 somegoal
  • mvn -pl module2 someothergoal

Ответ 2

Единственный способ контролировать, какие цели/ исполнения (не этапы) выполняются во время сборки Maven независимо от того, какой у вашего модуля есть модуль или нет, через профили.

Например:

/pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.company</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>
</project>

/module1/pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.company</groupId>
        <artifactId>parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>module1</artifactId>
</project>

/module2/pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.company</groupId>
        <artifactId>parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>module2</artifactId>

    <profiles>
        <profile>
            <id>module2:ignore-compile</id>

            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>default-compile</id>
                                <phase>none</phase>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

При запуске mvn -Pmodule2:ignore-compile package. Вы заметите, что исходная компиляция (но только эта цель/выполнение!) Будет проигнорирована для модуля2.

Вы также можете использовать activation:

<profiles>
    <profile>
        <id>module2:ignore-compile</id>

        <activation>
            <property>
                <name>module2:ignore-compile</name>
            </property>
        </activation>
        ....
    </profile>
</profiles>

Затем с командой: mvn -Dmodule2:ignore-compile package

Наконец, интересной возможностью является изменение модуля через профиль:

/pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.company</groupId>
    <artifactId>parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
    </modules>

    <profiles>
        <profile>
            <id>with:module2</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>

            <modules>
                <module>module2</module>
            </modules>
        </profile>
    </profiles>
</project>

Чтобы игнорировать module2: mvn '-P!with:module2' package