1. 将SpringBoot的项目的打包方式设置为war
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
2. 移除内嵌的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>
3. 添加tomcat-servelt-api依赖
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>7.0.42</version>
<scope>provided</scope>
</dependency>
4. 修改入口方法 继承一个SpringBootServletInitializer类,并且覆盖configure方法
package com.pzy.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication(exclude = { JmxAutoConfiguration.class })
@EnableFeignClients
public class StatisticsApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(StatisticsApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(StatisticsApplication.class, args);
}
}
5. 添加war插件,用来自定义打包以后的war包的名称
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warSourceExcludes>src/main/resources/**</warSourceExcludes>
<warName>springboot</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
6. 修改项目的context-path与warName一致
server:
context-path: /springboot
读取外部配置文件:
package com.free.DEMO.web;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
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 org.springframework.util.StringUtils;
import lombok.extern.log4j.Log4j;
/**
* <pre>
* 本地配置文件加载
* 如果存在系统变量DEMO_CONFIG_FILE,且有值则使用该值中指定的配置文件
* 如果未指定DEMO_CONFIG_FILE系统变量或该变量的值为空,
* 则根据操作系统读取"D:/DEMO/application.properties"或"/DEMO/application.properties"的配置文件
* 如果最终都未读取到任何外部配置文件,则使用jar包中的默认配置
* </pre>
*
* @author pan
*
*/
@Log4j
public class LocalSettingsEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
String locationApplicationFile = "D:/DEMO/application.properties";
String tmp = System.getenv().get("DEMO_CONFIG_FILE");// 从系统环境变量中读取运营中心的外部配置文件路径
System.out.println("外部配置文件:"+tmp);
if (!StringUtils.isEmpty(tmp)) {// 系统环境中有配置,则使用系统环境中配置的配置文件
locationApplicationFile = tmp;
} else { // 当前系统中为指定配置文件,则根据操作系统到指定目录去读取
String os = System.getProperty("os.name");
if (!os.toLowerCase().startsWith("win")) {
// 当前为linux系统
locationApplicationFile = "/DEMO/application.properties";
}
}
if (log.isDebugEnabled()) {
log.debug("使用可能的外部配置文件: " + locationApplicationFile);
}
File file = new File(locationApplicationFile);
if (file.exists()) {// 外部配置文件存在,则优先使用外部配置文件的配置
MutablePropertySources propertySources = environment.getPropertySources();
Properties localProperties = loadProperties(file);// 读取外部配置文件的配置信息
if (log.isDebugEnabled()) {
log.debug("\r\n######################\r\n外部配置文件内容为:\r\n" + localProperties.toString()
+ "\r\n######################\r\n");
}
propertySources.addFirst(new PropertiesPropertySource("LocalConfig", localProperties));// addFirst表示如果存在同名配置属性,优先使用localProperties中的
}
}
private Properties loadProperties(File f) {
FileSystemResource resource = new FileSystemResource(f);
try {
return PropertiesLoaderUtils.loadProperties(resource);
} catch (IOException ex) {
throw new IllegalStateException("外部配置文件加载失败: " + f.getAbsolutePath(), ex);
}
}
}
网友评论