SpringBoot项目打包成war包并部署到服务器上
背景说明
当我们使用springboot开发时,有的时候需要打war包在外部tomcat部署,方便运维人员维护,但是修改配置文件后重新打包给运维的时候,又需要修改一些配置这样还是不方便维护。
环境参数
开发环境:IntelliJ IDEA 2019.3
JDK:java version "1.8.0_144"
服务器:Linux CentOS7.2
项目配置
-
步骤一
打开pom.xml
查看打包方式(创建项目时选择的打包方式)
如果是jar就先改成war -
在
pom.xml
中添加一个dependency依赖(意思是tomcat是外部提供的)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
步骤三
-
新建
web.xml
(添加过的也可以跳过这一步),新建的方式有两种,一种是直接创建文件夹和文件,另一种是通过IDEA来创建。这里选用第二种方法。首先点击右上角的一个文件夹图标(Project Structure)
然后选择Modules,点击web(如果没有就点击左上角的加号新建一个),接着双击下方的Web Resource Directory中的第一项,这里是来设置webapp
的路径,一般是自动设置好了的,直接点ok
,然后点yes
就好了。
最后点击上面的加号新建
web.xml
这里要注意路径,要放到刚才创建的webapp
文件夹内。点击ok,然后再点击ok,web.xml
就创建好了。
-
步骤四
创建一个Initializer
类继承自SpringBootServletInitializer
,并重写configure
方法。且这个类应该与项目的Application在同一级目录下
自定义配置类实现EnvironmentPostProcessor接口
- EnvironmentPostProcessor是springboot支持动态读取文件的接口,实现EnvironmentPostProcessor接口覆写postProcessEnvironment方法
- 在postProcessEnvironment方法实现读取外部配置文件
- 使用YamlPropertiesFactoryBean来读取yml配置文件,getObject()方法可以获取Properties
Initializer
类:
package com.example.demo; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { //Application的类名 return application.sources(WardemoApplication.class); } }
项目打包
打包方式有两种,一直是使用命令行方式,另一种是通过maven
来打包,同样的,这里采用较为简单的第二种方式。
Maven Projects > 项目名 > Lifecycle > 双击package开始打包
war
包路径在项目文件夹的target
文件内
打包时跳过测试
在properties里面增加以下代码:
<skipTests>true</skipTests>
项目部署
把打包好的war
包放到tomcat
的webapps
文件夹下,然后重启tomcat
就可以了,tomcat
会自动解压。
注意项目启动后访问路径会发生变化,如之前的访问路径是/hello
,那么此时就得加上webapps
下解压的那个项目文件夹的名字,即/项目文件名/hello
。
查看日志
日志文件默认的路径为:tomcat目录下的/logs/catalina.out
文件中。
注意事项
打成war包之后,server.servlet.context-path,server.port失效
可能还有一种没那么多事的办法,具体没有尝试
(1)把静态文件从resource中移出来
(2) yml文件指定静态资源的目录
spring: #指定环境 profiles: active: @package.environment@ #打war时指定静态文件,没有效果 resources: static-locations: /static/,/public/ mvc: static-path-pattern: /** #静态资源映射路径
加载外部配置文件
删除项目中原有resources文件夹下原有的application.properties文件,然后进行打包发布,如果有连接数据库,tomcat会报错,因为没有指定相应的数据库资源。
1.在tomcat里的conf文件夹下添加进刚才删掉的application.properties文件
2.项目中新建config包,在该包下建立MyEnvironmentPostProcessor类实现EnvironmentPostProcessor接口,代码如下
import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.support.PropertiesLoaderUtils; import java.io.File; import java.io.IOException; import java.util.Properties; public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication application) { //tomcat路径 String property = System.getProperty("catalina.home"); System.out.println("catalinahome:"+property); String path =property+ File.separator+"conf"+File.separator+"application.properties"; File file = new File(path); System.out.println("Loading local settings from : "+path); if (file.exists()) { MutablePropertySources propertySources = configurableEnvironment.getPropertySources(); Properties properties = loadProperties(file); System.out.println(properties.toString()); propertySources.addFirst(new PropertiesPropertySource("Config", properties)); } } private Properties loadProperties(File f) { FileSystemResource resource = new FileSystemResource(f); try { return PropertiesLoaderUtils.loadProperties(resource); } catch (IOException ex) { throw new IllegalStateException("Failed to load local settings from " + f.getAbsolutePath(), ex); } } }
3.在classpath定义一个META-INF文件夹然后在其下面先建spring.factories文件,在其中指定:
MyEnvironmentPostProcessor路径根据自己的项目自行修改
org.springframework.boot.env.EnvironmentPostProcessor=com.wyh.data_center.config.MyEnvironmentPostProcessor
在pom.xml中配置maven打包时移除配置文件
4.再一次打包发布就成功并没有报错了,从下图中我们也看到了获取了相应的数据库信息
logback.xml配置文件丢到外面直接在.yml配置文件中配置好路径就可以了
配置访问静态资源
在web.xml文件添加下面的配置,就可以访问部署路径下的文件了,如localhost:8080/demo/index.js
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
https://www.jianshu.com/p/4f700110725e
https://www.jianshu.com/p/4f700110725e
https://blog.csdn.net/hzy522104212/article/details/97241374