Порядок изменения модуля Maven в том же профиле

У меня есть проект с 3 файлами pom и 2 профилями maven: prod и dev. Проблема в том, что когда я запускаю свой профиль разработчика с помощью cmd

mvn clean install -Pdev 

он строит проект с заказом:

  1. бэкэнд,
  2. внешний интерфейс

Когда я создаю проект с профилем prod, он создает проект с заказом:

  1. внешний интерфейс
  2. серверная часть

Как я хочу. Но когда я запускаю cmd

mvn clean install

Ему нужно собрать проект с профилем разработчика, и он это делает, но в следующем порядке: 1.frontend, 2.backend.

и это проблема, он меняет порядок модулей. Вот основной pom.xml

<groupId>com.main</groupId>
<artifactId>Main</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Main</name>
<description>Main Parent Project</description>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<modules>
    <module>backend</module>
    <module>frontend</module>
</modules>

вот бэкэнд pom.xml

 <artifactId>backend</artifactId>
<name>backend</name>
<description>Backend Project</description>



<parent>
    <groupId>com.main</groupId>
    <artifactId>Main</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>



<dependencies>
 ...
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
                <profiles>${spring-profiles}</profiles>
            </configuration>
        </plugin>
    </plugins>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <build.profile.id>dev</build.profile.id>
            <profileActive>dev</profileActive>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <build.profile.id>prod</build.profile.id>
            <profileActive>prod</profileActive>
        </properties>
            <dependencies>
                <dependency>
                    <groupId>com.main</groupId>
                    <artifactId>frontend</artifactId>
                    <version>${project.version}</version>
                    <scope>runtime</scope>
                </dependency>
            </dependencies>
    </profile>
</profiles>

а вот интерфейс pom.xml

   <artifactId>frontend</artifactId>
<name>frontend</name>
<description>Frontend Project</description>

<parent>
    <groupId>com.main</groupId>
    <artifactId>Main</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<build>
    <plugins>
        <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <version>1.0</version>
            <configuration>
                <workingDirectory>src/main/webapp</workingDirectory>
                <nodeVersion>v6.0.0</nodeVersion>
                <npmVersion>2.7.1</npmVersion>
                <nodeDownloadRoot>https://nodejs.org/dist/</nodeDownloadRoot>
                <npmDownloadRoot>https://registry.npmjs.org/npm/-/</npmDownloadRoot>
            </configuration>
            <executions>
                <execution>
                    <id>install node and npm</id>
                    <goals>
                        <goal>install-node-and-npm</goal>
                    </goals>
                    <phase>generate-resources</phase>
                </execution>
                <execution>
                    <id>npm install</id>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                    <configuration>
                        <arguments>install</arguments>
                    </configuration>
                </execution>
                <execution>
                    <id>npm rebuild node-sass</id>
                    <goals>
                        <goal>npm</goal>
                    </goals>

                    <configuration>
                        <arguments>rebuild node-sass</arguments>
                    </configuration>
                </execution>
                <execution>
                    <id>bower install</id>
                    <goals>
                        <goal>bower</goal>
                    </goals>
                    <configuration>
                        <arguments>install</arguments>
                    </configuration>
                </execution>
                <execution>
                    <id>gulp</id>
                    <goals>
                        <goal>gulp</goal>
                    </goals>
                    <phase>generate-resources</phase>
                    <configuration>

                            <arguments>${gulpProfile}</arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <build.profile.id>dev</build.profile.id>
            <profileActive>dev</profileActive>
            <gulpProfile>-d</gulpProfile>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <build.profile.id>prod</build.profile.id>
            <profileActive>prod</profileActive>
            <gulpProfile>-p</gulpProfile>
        </properties>
    </profile>
</profiles>

Можете ли вы помочь мне и сказать, почему это происходит?


person Bohdan Levkovych    schedule 19.07.2017    source источник


Ответы (2)


Обычно такие вещи разрешаются, потому что ваш интерфейс будет зависеть от банки, созданной вашим бэкэндом.

Таким образом, даже если он не зависит от времени компиляции, вы все равно можете добавить его в области provided:

<dependency>
   <groupId>${project.groupId}</groupId>
   <artifactId>backend</artifactId>
   <version>${project.version}</version>
   <scope>provided</scope>
</dependency>

Это сообщит реактору maven, что он всегда должен сначала создавать серверную часть, не изменяя полученный артефакт, который создается.

person Steve C    schedule 19.07.2017

  • Сначала удалите тег <activation> из файла backend/pom.xml. Я надеюсь, что вам нужно по умолчанию активировать только один профиль, который должен быть dev
  • Удалите зависимость, указанную в файле backend/pom.xml, из профиля prod. Ваш проект fronend должен зависеть от backend.
  • Добавьте зависимость backend в интерфейсе/pom.xml, как показано ниже (не в каком-либо конкретном профиле)

Код:

<dependency>
  <groupId>${project.groupId}</groupId>
  <artifactId>backend</artifactId>
  <version>${project.version}</version>
  <scope>provided</scope>
</dependency>

Теперь попробуйте команды ниже

mvn clean    // (default profile `dev`)
mvn clean --activate-profiles prod     // (with override profile `prod`)
person Rishikesh Darandale    schedule 19.07.2017
comment
@Богдан Левкович, помогли ли описанные выше шаги решить вашу проблему? - person Rishikesh Darandale; 20.07.2017