接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local)、(开发小组内自测的)开发环境(dev)、(提供给测试团队的)测试环境(test)、预发布环境(pre)、正式生产环境(prod),每种环境都有各自的配置参数,比如:数据库连接、远程调用的ws地址等等。如果每个环境build前手动修改这些参数,显然太不fashion.

maven早就考虑到了这些问题,看下面的pom片段:

<profiles>
<profile>
<!-- 本地环境 -->
<id>local</id>
<properties>
<db-url>jdbc:oracle:thin:@localhost:1521:XE</db-url>
<db-username>***</db-username>
<db-password>***</db-password>
</properties>
</profile>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<properties>
<db-url>jdbc:oracle:thin:@172.21.129.51:1521:orcl</db-url>
<db-username>***</db-username>
<db-password>***</db-password>
</properties>
<!-- 默认激活本环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
...
</profiles>

profiles节点中,定义了二种环境:local、dev(默认激活dev环境),可以在各自的环境中添加需要的property值,接下来修改build节点,参考下面的示例:

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

resource节点是关键,它表明了哪个目录下的配置文件(不管是xml配置文件,还是properties属性文件),需要根据profile环境来替换属性值。

通常配置文件放在resources目录下,build时该目录下的文件都自动会copy到class目录下:

以上图为例,其中spring-database.xml的内容为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db-url}" />
<property name="username" value="${db-username}" />
<property name="password" value="${db-password}" />
</bean>
</beans>

各属性节点的值,用占位符”${属性名}“占位,maven在package时,会根据profile的环境自动替换这些占位符为实际属性值。

默认情况下:

maven package

将采用默认激活的profile环境来打包,也可以手动指定环境,比如:

maven package -P dev

将自动打包成dev环境的部署包(注:参数P为大写)

最后再给2个实例的运用例子:

1、开发环境与生产环境数据源采用不同方式的问题

本机开发时为了方便,很多开发人员喜欢直接用JDBC直接连接数据库,这样修改起来方便;

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db-url}" />
<property name="username" value="${db-username}" />
<property name="password" value="${db-password}" />
<property name="defaultAutoCommit" value="false" />
<property name="initialSize" value="2" />
<property name="maxActive" value="10" />
<property name="maxWait" value="60000" />
</bean>

而生产环境,通常是在webserver(比如weblogic上)配置一个JNDI数据源,

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="appDS" />
</bean>

如果每次发布生产前,都要手动修改,未免太原始,可以通过maven的profile来解决。

先把配置文件改成

<bean id="${db-source-jdbc}" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db-url}" />
<property name="username" value="${db-username}" />
<property name="password" value="${db-password}" />
<property name="defaultAutoCommit" value="false" />
<property name="initialSize" value="2" />
<property name="maxActive" value="10" />
<property name="maxWait" value="60000" />
</bean>
<bean id="${db-source-jndi}" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="appDS" />
</bean>

即用占位符来代替bean的id,然后在pom.xml里类似下面设置

<profiles>
<profile>
<!-- 本机环境 -->
<id>local</id>
<properties>
...
<db-source-jdbc>dataSource</db-source-jdbc>
<db-source-jndi>NONE</db-source-jndi>
<db-url>jdbc:oracle:thin:@172.21.129.51:1521:orcl</db-url>
<db-username>mu_fsu</db-username>
<db-password>mu_fsu</db-password>
...
</properties>
<!-- 默认激活本环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 生产环境 -->
<id>pro</id>
<properties>
...
<db-source-jdbc>NONE</db-source-jdbc>
<db-source-jndi>dataSource</db-source-jndi>
...
</properties>
</profile>
</profiles>

这样,mvn clean package -P local打包本地开发环境时,将生成

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@172.21.129.***:1521:orcl" />
<property name="username" value="***" />
<property name="password" value="***" />
<property name="defaultAutoCommit" value="false" />
<property name="initialSize" value="2" />
<property name="maxActive" value="10" />
<property name="maxWait" value="60000" />
</bean>
<bean id="NONE" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="appDS" />
</bean>

而打包生产环境mvn clean package -P pro时,生成

<bean id="NONE" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="${db-url}" />
<property name="username" value="${db-username}" />
<property name="password" value="${db-password}" />
<property name="defaultAutoCommit" value="false" />
<property name="initialSize" value="2" />
<property name="maxActive" value="10" />
<property name="maxWait" value="60000" />
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="appDS" />
</bean>

spring配置的其它跟数据库相关的bean,约定引用dataSource这个名称的bean即可。

2、不同webserver环境,依赖jar包,是否打包的问题

weblogic上,允许多个app,把共用的jar包按约定打包成一个war文件,以library的方式部署,然后各应用在WEB-INF/weblogic.xml中,用类似下面的形式

<?xml version="1.0" encoding="utf-8"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90">
...
<library-ref>
<library-name>my-share-lib</library-name>
</library-ref>
</weblogic-web-app>

指定共享library 的名称即可。这样的好处是,即节省了服务器开销,而且各app打包时,就不必再重复打包这些jar文件,打包后的体积大大减少,上传起来会快很多。

而其它webserver上却未必有这个机制,一般为了方便,我们开发时,往往采用一些轻量级的webserver,比如:tomcat,jetty,jboss 之类,正式部署时才发布到weblogic下,这样带来的问题就是,本机打包时,要求这些依赖jar包,全打包到app的WEB-INF/lib下;而生产环境下,各应用的WEB-INF/lib下并不需要这些jar文件,同样还是用profile来搞定,先处理pom.xml,把依赖项改成类似下面的形式:

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
<scope>${jar.scope}</scope>
</dependency>

即scope这里,用一个占位符来代替,然后profile这样配置

<profile>
<!-- 本机环境 -->
<id>local</id>
<properties>
<jar.scope>compile</jar.scope>
...
</properties>
<!-- 默认激活本环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 生产环境 -->
<id>pro</id>
<properties>
<jar.scope>provided</jar.scope>
...
</properties>
</profile>

在maven里,如果一个依赖项的scope是provided,表示由容器提供,打包时将不会打包进最终的package里,所以这样配置后,生产环境打包时,依赖项的scope全变成了provided,即不打包进war文件,而本机环境下,因为scope是compile,所以会打包到war里

原文链接:https://blog.csdn.net/liupeifeng3514/article/details/79776257

(八)利用 Profile 构建不同环境的部署包的更多相关文章

  1. maven学习(下)利用Profile构建不同环境的部署包

    接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre) ...

  2. maven学习利用Profile构建不同环境的部署包

    项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre).正式生产环 ...

  3. Maven 教程(18)— 利用 Profile 构建不同环境的部署包

    原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79776257 接上回继续,项目开发好以后,通常要在多个环境部署,象我们公司多达5 ...

  4. [转]利用Docker构建开发环境

    利用Docker构建开发环境 Posted by  makewonder on 2014 年 4 月 2 日   最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境, ...

  5. 全面解读Python Web开发框架Django,利用Django构建web应用及其部署

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...

  6. 使用maven的profile构建不同环境配置

    基本概念说明(resources.filter和profile): 1.profiles定义了各个环境的变量id 2.filters中定义了变量配置文件的地址,其中地址中的环境变量就是上面profil ...

  7. maven 利用 profile 进行多环境配置

    我们在进行项目的多环境配置时,有很多种方式供我们选择,比如 SpringBoot 自带的 application-dev.yml.maven 的 profile 等.这里介绍的就是如何利用 profi ...

  8. 利用Docker构建开发环境

    最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环 ...

  9. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

随机推荐

  1. LibreOJ #515 贪心只能过样例

    题目链接:https://loj.ac/problem/515 知识点: DP.bitset类 解题思路: DP部分不难想到:从 a 到 b 遍历,然后在已有的状态上加上遍历得到的数字的平方,难点在于 ...

  2. wordpress评论回复邮件通知功能

    安装插件登录后台——点击“插件”——“安装插件”——按关键字搜索“Comment Reply Notification”——点击“现在安装”安装好后启用插件.如下图所示: 配置Comment Repl ...

  3. springmvc拦截器和概念,配置!!!

    用于拦截请求,过滤后再拦截 实现HandlerInterceptor接口 配置拦截器 package cn.zys.lanjieqi; import javax.servlet.http.HttpSe ...

  4. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  5. 关于docker的常见使用命令

    1. Docker的启动与停止 systemctl命令是系统服务管理器指令 启动docker: systemctl start docker 停止docker: systemctl stop dock ...

  6. 【Leetcode】560. 和为K的子数组&974. 和可被 K 整除的子数组(前缀和+哈希表)

    public class Solution { public int subarraySum(int[] nums, int k) { int count = 0, pre = 0; HashMap ...

  7. 【深度学习】PyTorch之Squeeze()和Unsqueeze()

    1. unsqueeze() 该函数用来增加某个维度.在PyTorch中维度是从0开始的. import torch a = torch.arange(0, 9) print(a) 结果: tenso ...

  8. SD.Team颜色代码大全

    EEEEEE FFCCFF FF66FF FF00FF DDDDDD FFCCCC FF66CC FF00CC CCCCCC FFCC99 FF6699 FF0099 BBBBBB FFCC66 FF ...

  9. OI 做题的常见错误

    会引起 Compile Error 的错误 由于这类错误过于简单,相信是个正常人都会修,故略写. int main() 写为 int mian() . 写完 struct 或 class 忘记写分号. ...

  10. Web-从Java Request对象到HTTP协议

    https://mp.weixin.qq.com/s/PjcA22STEDGwRxVQweObQQ Java Web中的Request对象是哪里来的?Response对象的角色是什么? Java We ...