springboot-21-maven多环境打包
前几天项目需要用到分环境打包, 于是研究了下, 由于项目基于springboot的, 所以分两个情况进行说明:
1), springboot的多环境配置
2), maven-springboot的多环境配置
项目gitHub地址: https://github.com/wenbronk/springboot-maven-profile
1, springboot的环境配置比较简单, yml和properties的配置相似, 不同的是, yml只需要在同一个文件中, properties需要3个不同的文件, 分别说明:
1) pom.xml 文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.wenbronk</groupId>
<artifactId>springboot-profiles</artifactId>
<version>0.0.-SNAPSHOT</version> <!-- 添加父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5..RELEASE</version>
</parent> <!-- 锁定jdk版本 -->
<properties>
<!-- 指定启动类(main方法的位置) -->
<start-class>com.wenbronk.App</start-class>
<java.version>1.8</java.version>
<!-- 构建编码 -->
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-</project.reporting.outputEncoding>
</properties> <dependencies> <!-- exclude掉spring-boot的默认log配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- spring-boot的web启动的jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 为了构建一个即是可执行的,又能部署到一个外部容器的war文件,你需要标记内嵌容器依赖为"provided" -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 加上这个才能辨认到log4j2.yml文件 -->
<dependency> <!-- 加上这个才能辨认到log4j2.yml文件 -->
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies> <build>
<finalName>spring-boot-profiles</finalName>
</build> </project>
2, application.yml
spring:
profiles:
active: dev # 开发环境
---
spring:
profiles: dev server:
port: 8090
my:
properties:
abc: devdevdev
# 测试环境配置
---
spring:
profiles: qa server:
port:
my:
properties:
abc: devdevdev
# 生产环境配置
---
spring:
profiles: prod
server:
port: 8000
my:
properties:
abc: devdevdev
3, 编写一个类测试:
App.java
package com.wenbronk.maven; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication
public class App extends SpringBootServletInitializer { /**
* war使用
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(App.class);
} /**
* jar使用
* @param args
* @throws Exception
* @time 2017年5月15日
*/
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args);
} }
TestController.java
package com.wenbronk.maven.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.wenbronk.maven.config.TestConfig; /**
* 测试多环境部署
*
* @author wenbronk
* @time 2017年5月12日
*/
@RestController
public class TestController { @Autowired
private Environment env; @Autowired
private TestConfig testConfig; /**
*
* @return
* @time 2017年5月12日
*/
@RequestMapping(value="/test")
public String test() {
System.out.println("connect success");
String property = env.getProperty("profile");
System.out.println("property " + property); String abc = testConfig.getAbc();
System.out.println(abc); return "sucess";
} }
TestConfig.java
package com.wenbronk.maven.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.wenbronk.maven.config.TestConfig; /**
* 测试多环境部署
*
* @author wenbronk
* @time 2017年5月12日
*/
@RestController
public class TestController { @Autowired
private Environment env; @Autowired
private TestConfig testConfig; /**
*
* @return
* @time 2017年5月12日
*/
@RequestMapping(value="/test")
public String test() {
System.out.println("connect success");
String property = env.getProperty("profile");
System.out.println("property " + property); String abc = testConfig.getAbc();
System.out.println(abc); return "sucess";
} }
此时启动端口可以看到由yml衷配置文件所制定的配置生效
2 maven-springboot
上面的配置有时候并不能满足我们的需要, 比如 db.properites, 不通的环境需要打包不同文件夹下的配置文件, 这时候还需要maven的打包方式
mvn clean package -Dmaven.test.skip=true -P dev -e
1, pom.xml的配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.wenbronk</groupId>
<artifactId>springboot-profiles-maven</artifactId>
<version>0.0.-SNAPSHOT</version>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>1.5..RELEASE</version>
</parent> <properties>
<start-class>com.wenbronk.profile.App</start-class>
<java.version>1.8</java.version>
</properties> <dependencies>
<!-- exclude掉spring-boot的默认log配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- spring-boot的web启动的jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 为了构建一个即是可执行的,又能部署到一个外部容器的war文件,你需要标记内嵌容器依赖为"provided" -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 加上这个才能辨认到log4j2.yml文件 -->
<dependency> <!-- 加上这个才能辨认到log4j2.yml文件 -->
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- springboot 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency> <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
</dependencies> <profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>qa</id>
<properties>
<profileActive>qa</profileActive>
</properties>
</profile>
</profiles> <build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>dev_conf/*</exclude>
<exclude>qa_conf/*</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/${profileActive}_conf</directory>
</resource>
</resources> <plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 如果没有这个, 不生效 -->
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build> </project>
2, src/main/resources/文件夹下放置不同环境的配置文件:

这儿使用application.properites, 使用yml就用上面那种方式
application.properties
spring.profiles.active=@profileActive@
applicatio-dev.properties
profile=dev_enviroment
server.port= my.properties.abc=devdevdev
application-prod.properties
profile=prod_enviroment
server.port=
my.properties.abc=prodprodprod
application-qa.properties
profile=qa_enviroment
server.port=
my.properties.abc=qaqaqaqa
3, 放置不同的 conf 下
--- dev_conf/db.properties
--- qa_conf/db.properties
qwer=
4, 接下来是程序编码
App.java, 在这儿为了区分, 在日志中将 使用的配置文件信息打印出来
package com.wenbronk.profile; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication
public class App extends SpringBootServletInitializer { /**
* war使用
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(App.class);
} /**
* jar使用
* @param args
* @throws Exception
* @time 2017年5月15日
*/
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
String[] activeProfiles = context.getEnvironment().getActiveProfiles();
for (String profile : activeProfiles) {
System.out.println("Spring Boot 使用profile为:" + profile);
}
}
}
TestConfig.java , 用于读取application-xxx.properties中的信息
package com.wenbronk.profile.config; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; @Component
@ConfigurationProperties(prefix = "my.properties")
public class TestConfig {
private String abc; public String getAbc() {
return abc;
} public void setAbc(String abc) {
this.abc = abc;
}
}
ResourceLoader.java, 读取外部资源文件
package com.wenbronk.profile.resource; import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component; /**
* 实现resourceLoaderAware , 加载外部资源文件
*
* @author wenbronk
* @time 2017年5月15日
*/
@Component
public class MyResourceLoader implements ResourceLoaderAware{ private ResourceLoader resourceLoader; public Resource getresourceLoader(String path) {
return resourceLoader.getResource("classpath:" + path);
} @Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
} }
controller.java测试
package com.wenbronk.profile.controller; import java.io.IOException; import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.wenbronk.profile.config.TestConfig;
import com.wenbronk.profile.resource.MyResourceLoader; /**
* 测试springboot-maven 分环境打包
*
* @author wenbronk
* @time 2017年5月15日
*/
@RestController
public class TestController { /**
* 可直接使用environment来配置
*/
@Autowired
private Environment env; @Autowired
private TestConfig testConfig; @Autowired
private MyResourceLoader resourceLoader; @RequestMapping("/test")
public String test() throws IOException {
String abc = testConfig.getAbc();
System.out.println(abc); String property = env.getProperty("profile");
System.out.println("property " + property); Resource resource = resourceLoader.getresourceLoader("db.properties");
String string = IOUtils.toString(resource.getInputStream(), "utf-8");
System.out.println(string);
return abc;
} }
运行后可以根据输入命令更改配置
为了进一步验证, 我们分别打 了war包和jar包, 可以看到根据输入的maven指令不同而替换不通的配置文件
在springboot测试中使用多环境:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles("prod")
原创地址: http://www.cnblogs.com/wenbronk/p/6855973.html, 转载请注明出处, 谢谢
springboot-21-maven多环境打包的更多相关文章
- 用maven按环境打包SpringBoot的不同配置文件
利用maven按环境打包SpringBoot的不同配置文件 application-dev.properties对应开发环境 application-test.properties对应测试环境 app ...
- springboot学习之maven多环境打包的几种方式
在应用部署的时候,往往遇到需要发布到不同环境的情况,而每个环境的数据库信息.密钥信息等可能会存在差异. 1.在默认的application.properties或者yaml中设置profile spr ...
- 使用Maven分环境打包:dev sit uat prod
使用Maven管理的项目,经常需要根据不同的环境打不同的包,因为环境不同,所需要的配置文件不同,比如database的连接信息,相关属性等等. 在Maven中,我们可以通过P参数和profiles元素 ...
- Maven多环境打包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- Springboot与Maven多环境配置文件夹解决方案
Profile用法 我们在application.yml中为jdbc.name赋予一个值,这个值为一个变量 jdbc: username: ${jdbc.username} Maven中的profil ...
- Maven 多环境 打包
1.pom.xml文件添加profiles属性 <profiles> <profile> <id>dev</id> <activation> ...
- maven 不同环境打包命令
mvn clean package mvn clean package -Pdev mvn clean package -Ptest mvn clean package -Pproduct
- springboot分环境打包(maven动态选择环境)
分环境打包核心点:spring.profiles.active pom.xml中添加: <profiles> <profile> <id>dev</id> ...
- springboot不同环境打包
1. 场景描述 springboot+maven打包,项目中经常用到不同的环境下打包不同的配置文件,比如连接的数据库.配置文件.日志文件级别等都不一样. 2. 解决方案 在pom.xml文件中定义 2 ...
- maven为不同环境打包(hibernate)-超越昨天的自己系列(6)
超越昨天的自己系列(6) 使用ibatis开发中,耗在dao层的开发时间,调试时间,差错时间,以及适应修改需求的时间太长,导致项目看起来就添删改查,却特别费力. 在项目性能要求不高的情况下,开始寻 ...
随机推荐
- Java Web系列:Spring MVC基础
1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...
- linux mongodb开机启动(服务的方式)
MongoDB安装 https://blog.csdn.net/junshangshui/article/details/79371316 设置mongodb.service启动服务 cd /lib/ ...
- JQuery中checkbox选择器
今天我们讲的是如何选择HTML网页中CheckBox选择器 如下图,是几个checkbox <input type='checkbox'checked="checked"/& ...
- 升级到Sharepoint 2013后页面打开速度慢
这个问题现在有了一些新的发现. 首先,我找到了重现客户那里出现的那个复杂SQL语句的方法.这个现象其实是这样的: 当WebApplication的“List View Threshold” 数量大于 ...
- BZOJ4283: 魔法少女伊莉雅(最短路径图+最短路径树)
题面 传送门 题解 太长了不想写了→_→ 题解 //minamoto #include<bits/stdc++.h> #define R register #define inf 0x3f ...
- k_means算法的C++实现
首先画出k_means算法的流程图:
- Python读取mdb文件以及shell检测
最近写了两个python的脚本不过实际意义不是很大,就是想练练python写程序,一直研究web方面脚本写的少多了,还有C语言也用的少多了.现在有时间得多写写程序,别把以前学到的知识给忘了. 作者: ...
- Drupal 远程命令执行漏洞(CVE-2018-7600)
名称: Drupal 远程命令执行漏洞 CVE-ID: CVE-2018-7600 Poc: https://paper.seebug.org/578/ EXPLOIT-DB: https://www ...
- Elasticsearch(八)【NEST高级客户端--Mapping映射】
要使用NEST与Elasticsearch进行交互,我们需要能够将我们的解决方案中的POCO类型映射到存储在Elasticsearch中的反向索引中的JSON文档和字段.本节介绍NEST中可用的所有不 ...
- isUserAMonkey? android真逗
QA报了个问题,说是无线热点下面的开关都没了,看了看代码,原来这是android的保护机制. 在涉及到用户信息的功能上,android会通过ActivityManagerNative.isUserAM ...