我已经为以下问题苦苦挣扎了大约一周,但我找不到任何有同样问题的人。
我有一个 Maven 项目,它由几个子模块组成,如下所示:
parent-module
child A (common library)
child B (spring boot application - no static content)
child C (spring boot application - static content and JSP
在 B 和 C 的集成测试中,我使用 spring-boot-maven-plugin 在集成测试之前运行 WAR 并在集成测试之后停止。
我可以毫无问题地导航到任何子模块并执行“mvn verify”。但是,如果我在父模块中并执行“mvn verify”,则子 A 和 B 将通过,但子 C 将失败,因为找不到静态内容和 JSP 页面。
我认为问题是由于Maven将从父模块而不是子模块运行应用程序,因此tomcat由于某种原因无法找到资源和WEB-INF文件夹。
例如,父项目中的以下命令:
parent> mvn -pl ../childC spring-boot:run
将启动子 C,但应用程序不会找到静态资源。但是来自子 C 模块的以下命令可以正常工作:
childC> mvn spring-boot:run
此外,为了检查我在自己的项目依赖项中没有做任何可疑的事情,我下载了spring boot tomcat jsp 示例并创建了一个父 POM,如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<version>0.0.1-SNAPSHOT</version>
<artifactId>my-parent</artifactId>
<packaging>pom</packaging>
<name>my-parent</name>
<groupId>com.test</groupId>
<modules>
<module>../jspsample</module>
</modules>
</project>
我刚刚修改了 spring boot 示例 pom 的父级,如下所示:
...
<parent>
<groupId>com.test</groupId>
<artifactId>my-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../myparent</relativePath>
</parent>
...
现在,如果我从父模块执行以下操作
myparent> mvn -pl ../jspsample spring-boot:run
并在我们的浏览器中打开http://localhost:8080我得到:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sun Sep 18 20:38:23 CEST 2016
There was an unexpected error (type=Not Found, status=404).
/WEB-INF/jsp/welcome.jsp
因此,似乎 spring-boot:run 在父模块中不起作用。有没有人有解决这个问题的方法。是否可以在启动 WAR/JAR 之前指示 Maven 或 spring boot 插件导航到子模块?
需要注意的是,我最近将我的“标准”spring MVC 项目移植到了 spring boot。在 spring boot 之前,我使用了 tomcat maven 插件而不是 spring boot 插件,并且那个插件工作得很好。