Spring Boot Maven插件无法找到主类,无法执行Java

时间:2018-08-16 09:45:25

标签: java maven spring-boot spring-boot-maven-plugin

我有一个多模块Maven spring-booot maven项目。子模块之一是存根(Spring Boot应用程序),我想在对 myRealApp 进行集成测试时启动然后停止。 / p>

Parent Pom
|   
|----myRealApp module(spring boot app)
|----stub-of-some-remote-rest-api module(This is also a spring-boot app)

这就是模块myRealApp中pom文件的外观。其中也有所有的集成测试。它试图在集成测试阶段之前启动存根模块。但是在子模块目录中运行maven目标时出现错误:

 mvn integration-tests -X
  

错误:找不到或加载主类io.swagger.MyStub

     

org.apache.maven.lifecycle.LifecycleExecutionException:失败   执行       目标org.springframework.boot:spring-boot-maven-plugin:1.5.8.RELEASE:run       (启动)项目上:无法执行Java

我可以在调试模式下看到工作目录设置正确。

myRealApp的pom:

         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${spring.boot.mainclass}</mainClass>
            </configuration>
            <executions>
                <execution>
                    <configuration>
                        <workingDirectory>${project.parent.basedir}/module-of-my-stub/src/main/java</workingDirectory>
                        <mainClass>io.swagger.MyStub</mainClass>
                    </configuration>
                    <id>start-boot</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
                <execution>
                    <id>stop-boot</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
                <execution>
                    <goals>
                        <goal>build-info</goal>
                    </goals>
                </execution>
            </executions>

        </plugin>

也许我不允许在单个执行中设置workingDirectory,或者不能引用其他模块?

在那里,存根就像我的应用程序所依赖的远程休息服务一样,我在开发期间就使用了它,因为实际的远程服务的测试环境不可靠,并且停机了一半时间。因此决定在集成测试中也使用它。

2 个答案:

答案 0 :(得分:1)

要巩固对这个问题的一些评论,这些评论基本上遵循this other answer中的建议。

关键是将classesDirectory相对于spring-boot-maven-plugin:run目标设置为指向另一个项目下的target\classes目录。

  <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <mainClass>${spring.boot.mainclass}</mainClass>
        </configuration>
        <executions>
            <execution>
                <id>start-stub</id>
                <configuration>
                    <arguments>
                        <argument>--server.port=8090</argument>
                    </arguments>
                    <mainClass>io.swagger.Stub</mainClass>
                    <classesDirectory>../my-stub/target/classes</classesDirectory>
                </configuration>
                <goals>
                    <goal>start</goal>
                </goals>
                <phase>pre-integration-test</phase>
            </execution>

            <execution>
                <goals>
                    <goal>build-info</goal>
                </goals>
            </execution>
        </executions>
  </plugin>

答案 1 :(得分:0)

spring-boot:run仅适用于打包springboot应用程序的项目。进行这项工作的最佳选择:您需要使用exec-maven-plugin:exec,确保将async设置为true。查看https://www.mojohaus.org/exec-maven-plugin/examples/example-exec-for-java-programs.html,了解如何配置插件。