将springboot项目由jar包转war包相关问题
大家都知道在springboot构建的项目的初始依赖文件中,会包含tomcat相关的插件,然后我们在application.properties中可以通过server.port等属性设置内置的tomcat相关的属性,但是此次需要在tomcat中添加安全检测文件,所以之前一直使用jar包运行的方式行不通了,改打war包。
war包的好处:
- 方便服务器对其监控
- 文件的上传时可以对文件进行管理
war包的坏处:
不便于使用外置配置文件
首先,更改pom文件依赖:(排除内置的tomcat插件,并提供运行时的tomcat依赖,这样在本地仍能直接运行项目)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
更改pom文件打包方式:
更改pom文件打包插件:
<build>
<!-- 添加finalName可以指定打出的war包名字而不带版本号,需于你项目指定的context-path保持一致 -->
<finalName>项目名</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
修改启动类或是新建类继承SpringBootServletInitializer:
@SpringBootApplication
@EnableSwagger2
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然后运行mvn clean package即可打成war包
将war包放入tomcat的webapps的中,启动tomcat可自动解压war包运行项目。
本来到上面的步骤,就可以正常启动项目了:
然鹅出现了一系列的状况:
1.静态文件资源找不到
主页中的登陆界面的背景图片均无法访问,然而js等资源仍没有问题。找到相应页面对应内容后,发现使用的图片链接是 “…/static/img/…jpg”,修改为“static/img/…jpg”后可以正常访问
2.项目中除了登陆和主页均无法访问
项目正常启动后使用127.0.0.1:8080/项目名 可以正常跳转到登陆页面登陆成功进入主页,然而内部的链接均无法跳转。
一番排查后发现是因为项目在初始搭建时并未配置server.context-path = /项目名,也就是说项目中的跳转内容均为端口号加跳转链接直接跳转,然而将项目放入外置tomcat中直接解压运行的话相当于默认项目的访问路径前加入了/项目名,解决方法:
在外置tomcat的server.xml中修改配置:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="D:\test" reloadable="true" debug="0"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
docBase中放置的是你war包解压缩的项目文件,一般放在webapps以外的文件夹。前面Path为空,表示不输入path默认访问项目
3.项目启动后并未使用外置tomcat的jar包进行运行
在windows上的tomcat实验完毕,将项目部署到linux上面的时候却又有问题,发现扫描的安全问题应该已经解决了,但是仍在持续报错,重新安装tomcat后仍出现相同问题,最后发现本地实验启动时前面的页面图标是tomcat的公猫形象,而服务器上启动时页面图标为springboot的绿叶形象,怀疑并未使用tomcat启动,然而关闭tomcat后项目确实停止了,解决方法:
排查到打出来的war包中的结构为
多了一个lib-provided,删除后运行项目终于正常了,启动图标也变更为tomcat的图标,但是仍不清楚为什么在外置服务器上运行时会使用provided的jar包,希望大佬能指教指教。
上面的问题加修改花了很多时间,分享给大家希望能有点帮助,如有错误欢迎指正。