Как выполнить другую цель для одного модуля многомодульного проекта? - PullRequest
17 голосов
/ 06 ноября 2010

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

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

project
 + module1
 + module2

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

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

mvn install -Dspecial=module:compile

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

Ответы [ 2 ]

28 голосов
/ 06 ноября 2010

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

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

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

  • mvn -pl module1,module3 somegoal
  • mvn -pl module2 someothergoal
2 голосов
/ 01 июня 2017

Единственный способ контролировать, какие цели / казни (не фазы ) выполняются во время сборки 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...