Плагин Maven Spring Boot: как запустить весеннюю загрузку из другого проекта - PullRequest
0 голосов
/ 29 мая 2018

https://docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html

У меня есть проект с двумя модулями.

[Parent]  
|-pom.xml
|  [SpringBoot2App]  
|  |-pom.xml  
|  [test]  
|  |-pom.xml  (start goal here!)

Я хочу запустить интеграционные тесты (maven failsafe plugin) в отдельном проекте, который является другим модулем.

Можно ли настроить подключаемый модуль maven с пружинной загрузкой для запуска / остановки дочернего модуля во время интеграционных тестов родительского модуля?

Я пытался что-то подобное безуспешно

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>

            <configuration>

                <mainClass>com.SimpleServiceApplication</mainClass>
                <classesDirectory>../SpringBoot2App/target/classes</classesDirectory>
                <folders>
                     <param>../SpringBoot2App/target/test-classes</param>
                </folders>

            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>start</goal>
                    </goals>
                    <phase>pre-integration-test</phase>
                </execution>
            </executions>
        </plugin>

Что не работает.

Я также попытался добавить параметр "проект" после чтения источника суперкласса плагина https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractRunMojo.java

            <configuration> 
                <mainClass>com.SimpleServiceApplication</mainClass>
                <project>${project.parent.collectedProjects[0]}</project>
            </configuration>

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

Пожалуйста, не комментируйте [0], я знаю, что [0] не является чистым и представляет собой связь, которая требует непосредственного знанияпорядка родительского модуля pom.

Я получаю java.lang.NoClassDefFoundError в org / springframework / boot / SpringApplication

Я добавил стартовый веб-проект в тест pom.xml, тот же результат

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Решения от RyanP полностью соответствуют потребностям.

Но мне все-таки удалось заставить его работать, не повезло, я думаю:)

  1. потребовалосьдобавление в модуль TEST зависимостей, необходимых для запуска приложения.(в данном случае spring-boot.starter-web)

  2. для добавления классов тестов требуется очень интересный синтаксис

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

Честно говоря, я все еще попробую оба решения выше, но только для шоу, вот что я наконец-то заработал

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>

            <executions>
                <execution>
                    <id>start-mocked-app</id>
                    <configuration>

                        <arguments>
                            <argument>--server.port=${tomcat.http.port}</argument>
                        </arguments>

                        <mainClass>xxx.TestApplication</mainClass>
                        <classesDirectory>../${api-module}/target/classes</classesDirectory>

                        <folders>
                            <!-- wow! notice the weird "./" rather than the expected "../" -->
                            <folder>./${api-module}/target/test-classes</folder>
                        </folders>


                        <profiles>
                            <profile>MOCKED</profile>
                        </profiles>

                    </configuration>
                    <goals>
                        <goal>start</goal>
                    </goals>
                    <phase>pre-integration-test</phase>
                </execution>

                <execution>
                    <id>stop</id>

                    <goals>
                        <goal>stop</goal>
                    </goals>
                    <phase>post-integration-test</phase>
                </execution>
            </executions>
        </plugin>

И ...

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- ... -->
</dependencies>
0 голосов
/ 30 мая 2018

Я не думаю, что можно выполнить интеграционные тесты с другим модулем, используя spring-boot-maven-plugin, потому что цель start, похоже, не дает вам средства для разрешения приложения из локального репозитория или реактора Maven,что, вероятно, то, что вы хотите.Свойство конфигурации project, которое вы пробовали, не предназначено для переопределения таким образом.Выполнения плагина должны быть настроены с использованием только свойств, перечисленных в цели плагина документы .

Вместо этого я думаю, что у вас есть как минимум два возможных подхода:

  1. Используйте другой плагин для управления сервером;или
  2. Запустите сервер непосредственно из тестов в коде.

Опция 1

Для этого, я думаю, вам нужен подход, который копирует нужный артефакт сервераработать вместе с чем-то более общим для запуска и остановки, например cargo-maven2-plugin или process-exec-maven-plugin .

Justнастроить цель repackage в сборке артефакта сервера:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <excludeDevtools>true</excludeDevtools>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Затем из модуля интеграционных тестов вы можете сделать что-то вроде:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-server-artifact</id>
            <goals>
                <goal>copy</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>SpringBoot2App</artifactId>
                        <version>${project.version}</version>
                        <classifier>jar</classifier>
                        <outputDirectory>${project.build.directory}</outputDirectory>
                        <destFileName>app.jar</destFileName>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>com.bazaarvoice.maven.plugins</groupId>
    <artifactId>process-exec-maven-plugin</artifactId>
    <version>0.7</version>
    <executions>
        <execution>
            <id>start-server</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>start</goal>
            </goals>
            <configuration>
                <name>run-server</name>
                <waitForInterrupt>false</waitForInterrupt>
                <healthcheckUrl>http://localhost:8080</healthcheckUrl>
                <arguments>
                    <argument>java</argument>
                    <argument>-jar</argument>
                    <argument>${project.build.directory}/app.jar</argument>
                </arguments>
            </configuration>
        </execution>

        <execution>
            <id>stop-server</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>stop-all</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Опция 2

Просто объявите нормальную зависимость Maven от артефакта сервера от тестового артефакта и запустите @SpringBootApplication класс сервера в JUnit перед хуком или что у вас есть, например

private static ConfigurableApplicationContext context;

@BeforeClass
public static void setUp() {
    context = new SpringApplicationBuilder(SimpleServiceApplication.class).run();
}

@AfterClass
public static void tearDown() {
    if (context != null) {
        context.close();
    }
}

Это может быть достаточно для вашегонеобходимо.

...