SpringBoot打成war包引⼊外部配置⽂件部署Tomcat
前⾔:Spring Boot因其特定的配置⽅式,受到了Java开发者们的热捧,成为了近年来最受欢迎的Java开发框架,当下的Coder如果要新创建项⽬,⾸选都是Spring Boot,⽽且与微服务有着完美的切⼊⼝。Spring Boot中内置的Tomcat插件,使得开发者不需要进⾏额外的Tomcat配置,就可⼀键启动项⽬。
Spring Boot可以打包成jar或者war的形式部署,现在⽣产很⼤⼀部分也是通过打包成war包的形式去进⾏部署,Spring Boot项⽬也可以直接打包成可执⾏的jar或者war包,直接使⽤java -jar xx.jar/xx.war。
这种⽅式的话,Spring Boot项⽬的配置依赖之类的都在jar或war之内,如果需要更改配置,则需要从重新打包重启,不利于运维。
下⾯介绍如何将Spring Boot和配置分离打包成war,放⼊Tomcat中运⾏,引⼊外部配置。
前提条件:⼀个SpringBoot项⽬+Tomcat容器(我⽤的是8.5.53)
1.先去除spring-boot-starter-web依赖中内置的tomcat容器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
<!-- 移除嵌⼊式tomcat插件 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
2.添加javax.servlet-api或者tomcat-servlet-api依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
3.修改项⽬默认启动⽅式,启动类继承SpringBootServletInitializer类重写configure()⽅法,也可以新建类继承SpringBootServletInitializer类重写configure()⽅法,两种⽅式如下分别如下展⽰
启动类继承SpringBootServletInitializer类
package com.xiaochun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 启动类继承SpringBootServletInitializer,重写configure(SpringApplicationBuilder builder)⽅法,返回当前启动类
*/
@SpringBootApplication
public class XiaochunApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(XiaochunApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(XiaochunApplication.class);
}
}
新建类继承SpringBootServletInitializer类
package com.xiaochun;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* 取代原先SpringBoot启动XiaochunApplication.main()⽅法启动整个项⽬的⽅式
* 修改启动类,继承 SpringBootServletInitializer 并重写 configure ⽅法
*/
public class XiaochunStartApplication extends SpringBootServletInitializer {
/**
* 默认返回figure(builder);
* 现指向XiaochunApplication.main()启动⽅法
* @param builder
* @return
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// figure(builder);
return builder.sources(XiaochunApplication.class);
}
}
4.配置⽂件分离,在pom⽂件build标签中加⼊以下配置
<resources>
<resource>
<directory>src/main/resources</directory>
<!--打包时排除src/main/resources下的所有以.properties .yml .xml为后缀的配置⽂件-->
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.yml</exclude>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
</resources>
5.创建外部配置⽂件xiaochun.properties,我把他放在D盘下,内容如下
xiaochun.version=0.lease
xiaochun.descriprtion=How to package SpringBoor project to war;
6.使⽤EnvironmentPostProcessor实现程序启动时⾃动加载⾃定义属性⽂件,新建EnvironmentPostProcessorConfig类,指定外部配置⽂件绝对路径(全路径),内容如下package fig;
import ums.ResourcesEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.v.EnvironmentPostProcessor;
import nv.ConfigurableEnvironment;
import nv.PropertiesPropertySource;
import org.springframework.stereotype.Component;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 配置启动,⽤于加载外部配置⽂件
*/
@Component
public class EnvironmentPostProcessorConfig implements EnvironmentPostProcessor {
private Logger logger = Class());
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
try {
//ResourcesEnum为枚举类
InputStream inputStream = new FileInputStream(ResourcesEnum.Path());
Properties properties = new Properties();
properties.load(inputStream);
PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource("my",properties);
} catch (IOException e) {
<("读取⾃定义配置异常");
}
}
}
枚举类内容如下
package ums;
import lombok.Data;
/**
* 外部配置⽂件枚举类,外部配置⽂件path从这⾥获取
*/
public enum ResourcesEnum {
PROPERTIES_PATH("全局配置⽂件", "D:\\xiaochun.properties");
private String label;
private String path;
ResourcesEnum(String label, String path) {
springframework和springbootthis.label = label;
this.path = path;
}
public String getLabel() {
return label;
}
public String getPath() {
return path;
}
}
7.在resources下新建META-INF\spring.factories,⽂件内容为如下,⽤于指定项⽬启动的,也就是上⼀步我们⾃定义的EnvironmentPostProcessorConfig
org.v.EnvironmentPostProcessor=fig.EnvironmentPostProcessorConfig
8.打包成war放在tomcat容器的webapps⽬录下,启动tomcat
9.启动tomcat,访问/home/index接⼝,验证我们刚配置的那些内容,接⼝内容如下
package ller;
import com.fasterxml.jackson.databind.util.JSONPObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.json.GsonJsonParser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/home")
public class HomeController {
private Logger logger = Class());
@Value("${xiaochun.version}")
private String version;
@Value("${xiaochun.descriprtion}")
private String description;
@GetMapping("/index")
public String index(){
Map<String, Object> map = new HashMap<String, Object>();
map.put("index", "index");
map.put("version", version);
map.put("description", description);
String();
}
}
访问结果如下
可以看出,我们的配置是有效的,这样就可以实现不同的环境,我们只需要打包业务相关的代码,不需要去理会配置如何,同⼀个包,可在测试、⽣产等不同的环境部署。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论