Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot maven插件找不到主类,无法执行java_Java_Maven_Spring Boot_Spring Boot Maven Plugin - Fatal编程技术网

Spring Boot maven插件找不到主类,无法执行java

Spring Boot maven插件找不到主类,无法执行java,java,maven,spring-boot,spring-boot-maven-plugin,Java,Maven,Spring Boot,Spring Boot Maven Plugin,我有一个多模块maven spring booot maven项目。其中一个子模块是存根(一个spring boot应用程序),我想在集成测试myRealApp时启动它,然后停止它 Parent Pom | |----myRealApp module(spring boot app) |----stub-of-some-remote-rest-api module(This is also a spring-boot app) 这是模块myRealApp中pom文件的外观。它也有所有的集

我有一个多模块maven spring booot maven项目。其中一个子模块是存根(一个spring boot应用程序),我想在集成测试myRealApp时启动它,然后停止它

Parent Pom
|   
|----myRealApp module(spring boot app)
|----stub-of-some-remote-rest-api module(This is also a spring-boot app)
这是模块myRealApp中pom文件的外观。它也有所有的集成测试。它试图在集成测试前阶段启动存根模块。但是,当我在子模块目录中运行maven goal时,出现了错误:

 mvn integration-tests -X
错误:无法找到或加载主类io.swagger.MyStub

org.apache.maven.lifecycle.LifecycleExecutionException:未能 执行 目标org.springframework.boot:springbootmaven插件: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>

org.springframework.boot
springbootmaven插件
${spring.boot.mainclass}
${project.parent.basedir}/mystub/src/main/java的模块
伊奥·斯威格·迈斯图
启动引导
预集成测试
跑
停止启动
整合后测试
停止
构建信息
也许我不允许在单个执行中设置workingDirectory,或者引用其他模块


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

springboot:run
仅适用于打包springboot应用程序的项目。实现此功能的最佳选项:您需要使用,确保
async
设置为
true
。查看以了解您应该如何配置插件。

为了整合针对该问题的一些评论,这些评论基本上遵循了中的建议

关键是针对
springbootmaven插件:run
goal设置
classesDirectory
,以指向另一个项目下的
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>

org.springframework.boot
springbootmaven插件
${spring.boot.mainclass}
起始存根
--server.port=8090
伊奥·斯威格·斯图克
../my stub/target/classes
开始
预集成测试
构建信息

为什么要将spring boot maven插件配置为不同的执行?如果您喜欢编写集成测试,那么这很容易……此外,为什么要使用这样一个奇怪的目录
/my stub/src/main/java
?请遵循Maven的约定和Spring Boot的约定…此外,您应该阅读关于测试Spring Boot应用程序的指南,因为没有必要为Spring Boot应用程序编写存根…@khmarbaise存根就像我的应用程序所依赖的远程rest服务一样,我在开发过程中使用了它,因为实际的远程服务的测试环境不可靠,并且有一半的时间处于停机状态。那么为什么不在集成测试中也使用它呢?为什么它是一个奇怪的目录?我试图从我的应用程序中找到存根模块的主类。恐怕你不明白我的问题。@khmarbaise我更新了问题,理想情况下,有一种方法可以将存根的
模块
依赖项添加到
spring boot maven plugin:run
goal使用的类路径中。看起来没有直接的方法,尽管有一个选择。还讨论了另一种方法。反过来说,这是推测。其思想是,通过将stub的
模块的测试依赖项添加到
myRealApp
,然后将
useTestClasspath
添加到现有的
spring boot maven plugin:run
配置中,这将使
MyStub
在类路径上可见。否则,上面链接中的
classesDirectory
技巧应该能够将其指向我存根的
模块下的
target/classes
目录。