问题1:笔者在启动一个多模块的maven项目时,每个模块都是一个maven项目,通过pom文件设置依赖关系,本次要讨论的问题为通过模块module1里面写的一个controller方法返回module2里面的一个jsp页面,在idea里面设置工作目录为模块路径(否则也可能找不到jsp页面),在module2的application.xml配置了jsp的路径为"WEB-INF/jsp",后缀为“.jsp”,然后启动运行没有问题,然而当我将这几个模块打成一个jar包时,在cmd里面通过java -jar运行,通过浏览器访问的时候一直提示找不到jsp页面,在网上找了好久才发现问题的原因,是由于我使用的springboot版本为1.5.2,貌似从1.4.2版本之后就不太支持jsp了。所以用高于1.4.2版本的springboot打包工具打的包里面会少一部分内容,这才导致找不到jsp页面的错。
解决方法:
1.在pom文件中设置打成war包;
然后打成了war包,这时候笔者又将生成的war包的后缀改为.jar,再次通过java -jar 运行,还是报错。这时候已经搞了一天了,真的很烦;这次出错的原因估计又是打包的问题,所以笔者放弃了改成jar包这种方式,沿用之前生成的war包,这时候又遇到了第二个问题,就是springboot里面配置了内嵌的tomcat,但是war包又只能通过自己电脑上装的tomcat跑起来,于是又遇到了第二个问题。
问题2:怎么设置springboot内置的tomcat不生效。
解决方法:
1.找到pom配置springboot的地方,这个地方有两种方案如下:
第一种方案如下,在spring-boot-starter-web下加了排除的设置,这样在加载springboot模块的时候就会排除tomcat模块的加载,笔者使用的是第一种方案。
第二种方案
因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有这个javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了
配置好了之后,在这里需要在之前启动类的同一目录下添加SpringBootStartApplication文件类如下:
public class SpringBootStartApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
这里的Application即为之前的启动类,到这里笔者以为问题解决了没想到又遇到了另一个问题,这个问题可能对一部分人来说是没有的,下面先阐述一下问题。由于笔者的项目里面的js、css包括jsp对于路径有要求,在通过浏览器访问时必须只能通过ip+端口才能
正确的跑起整个项目,于是笔者在自己的tomcat配置文件conf目录下面的server.xml配置了通过localhost:8080访问项目,具体配置如下:
配置完之后,通过startup.bat启动项目,发现我的程序在tomcat容器里运行了两次导致报错,看了网上的资料之后才知道tomcat在启动后首先会加载一次Host里面appBase目录下的内容,此时我的项目就在webapps目录下,然后我配置了一个Context,tomcat又会加载一次,所以导致项目启动两次。
解决方法:
1.将要部署的项目放在另一个目录下,例如笔者在webapps同级目录下创建了一个webroot目录,把我们的项目放在这下面,上面的配置也改成了如下:
再次启动tomcat,我天,终于搞定了,真是不容易啊,在这里把问题记录一下,可能说的不是很清楚,具体的大家可以再自行百度详细一点,这里只是说了个大概的思路,也希望如果有遇到同样的问题的人能给你们一点参考。