将springboot项目由jar包转war包相关问题

大家都知道在springboot构建的项目的初始依赖文件中,会包含tomcat相关的插件,然后我们在application.properties中可以通过server.port等属性设置内置的tomcat相关的属性,但是此次需要在tomcat中添加安全检测文件,所以之前一直使用jar包运行的方式行不通了,改打war包。
war包的好处:

  1. 方便服务器对其监控
  2. 文件的上传时可以对文件进行管理

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文件打包方式:

springboot jar包打成docker镜像 springboot jar转war_spring


更改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包中的结构为

springboot jar包打成docker镜像 springboot jar转war_spring_02


多了一个lib-provided,删除后运行项目终于正常了,启动图标也变更为tomcat的图标,但是仍不清楚为什么在外置服务器上运行时会使用provided的jar包,希望大佬能指教指教。

上面的问题加修改花了很多时间,分享给大家希望能有点帮助,如有错误欢迎指正。