文档章节

Maven profile整合Spring profile

逝去的回忆
 逝去的回忆
发布于 2016/10/08 13:56
字数 1165
阅读 285
收藏 2

在Maven的pom.xml和Spring框架中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile经常用于在打包时根据指定环境打入不同的配置文件配置,如数据库配置。Spring的Profile可以用于在不同的环境下加载不同的bean,例如@Profile注解。本文介绍如何将二者整合。

Spring启用一个profile

Spring启用某个profile有多种方式,为了便于整合Maven,这里通过web.xml方式启用:

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>

在默认情况下,会启用Spring的dev profile,即开发环境。

Maven profile配置

在pom.xml中,可以配置test和product两个profile,分别对应测试环境和正式环境。这里也可以根据具体情况自定义。

<profiles>
  <profile>
    <id>test</id>
    ...
  </profile>
  <profile>
    <id>product</id>
    ...
  </profile>
</profiles>

此时,运行mvn clean package -Ptest就会使用id为test的profile内的配置打包,mvn clean package -Pproduct就是用来打正式环境包的命令。

web.xml内容替换

在web.xml中<param-value>dev</param-value>是指定Spring的profile,接下里要实现这个内容的替换,让mvn clean package -Ptest打包出来的web.xml变成<param-value>test</param-value>。这里可以使用maven-antrun-plugin来实现字符串替换:

<profiles>
  <profile>
    <id>test</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- web.xml中的<param-value>dev</param-value>替换为<param-value>test</param-value> -->
                  <replace file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;test&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>product</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- web.xml中的<param-value>dev</param-value>替换为<param-value>product</param-value> -->
                  <replace file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;product&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>


以上的<replace file="" token="" value="" />中分别用于指定文件、待替换字符串、替换后的字符串。这里为什么不写成token="dev"?考虑到”dev”这个字符串太短,可能会在web.xml中别的地方出现,防止误伤,所以这里会用token="&lt;param-value&gt;dev&lt;/param-value&gt;"

以上配置加入到pom.xml中后,再通过mvn clean package -Ptestmvn clean package -Pproduct命令打包,打包好的war包解压出来,可以发现<param-value>dev</param-value>被替换成了<param-value>test</param-value><param-value>product</param-value>。此时便完成了Maven和Spring的profile的整合。

优化:打包时不修改src目录下的web.xml

如果使用mvn clean package -Ptestmvn clean package -Pproduct打包,会造成项目中的web.xml修改替换,此时如果忘了改回来,会造成一些问题,如再次打不同环境的包就找不到<param-value>dev</param-value>来replace了,还有如果此时在开发中调试会误启用其他的Spring profile。

为了解决这个问题,我们可以通过maven-antrun-plugin插件在replace前将web.xml拷贝一份出来,在拷贝出的web.xml文件上执行replace操作,打包时将拷贝出的web.xml打入war包,从而不影响原有的web.xml文件内容。

<profiles>
  <profile>
    <id>test</id>
    <properties>
      <!-- 使用target/web-xml中的web.xml文件打入war包 -->
      <maven.war.webxml>${basedir}/target/web-xml/web.xml</maven.war.webxml>
    </properties>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- 将web.xml拷贝一份到target/web-xml目录下 -->
                  <copy file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                        todir="${basedir}/target/web-xml" />
                  <!-- 拷贝后的web.xml中的<param-value>dev</param-value>替换为<param-value>test</param-value> -->
                  <replace file="${basedir}/target/web-xml/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;test&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>product</id>
    <properties>
      <!-- 使用target/web-xml中的web.xml文件打入war包 -->
      <maven.war.webxml>${basedir}/target/web-xml/web.xml</maven.war.webxml>
    </properties>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
          <executions>
            <execution>
              <phase>compile</phase>
              <configuration>
                <target>
                  <!-- 将web.xml拷贝一份到target/web-xml目录下 -->
                  <copy file="${basedir}/src/main/webapp/WEB-INF/web.xml"
                        todir="${basedir}/target/web-xml" />
                  <!-- 拷贝后的web.xml中的<param-value>dev</param-value>替换为<param-value>product</param-value> -->
                  <replace file="${basedir}/target/web-xml/web.xml"
                           token="&lt;param-value&gt;dev&lt;/param-value&gt;"
                           value="&lt;param-value&gt;product&lt;/param-value&gt;" />
                </target>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>


为什么不使用多个web.xml文件

以上是使用了一种web.xml文件字符串替换的方式来实现Maven和Spring的profile整合。另外还有一种配置多个web.xml文件的方式,即为每个profile拷贝一份web.xml,修改相应spring.profiles.active的值,pom.xml中每个profile指定对应的maven.war.webxml将相应的web.xml打入war包。如果项目需要经常修改web.xml文件内容,每次都要修改好几份web.xml文件会非常麻烦,所以不推荐使用。

© 著作权归作者所有

逝去的回忆
粉丝 16
博文 136
码字总数 219872
作品 0
深圳
高级程序员
私信 提问
maven 整合 spring profiles功能

spring为beans标签提供了profile功能,以便项目的开发和生成环境分离。 <beans xmlns="http://www.springframework.org/schema/beans" </beans> 以数据库为例,开发环境使用的是直接将配置写......

yybear
2013/03/14
13.2K
0
spring boot + maven使用profiles进行环境隔离

Spring Profile Spring可使用Profile决定程序在不同环境下执行情况,包含配置、加载Bean、依赖等。 Spring的Profile一般项目包含:dev(开发), test(单元测试), qa(集成测试), prod(生产环境)...

流浪的猪猪
2018/11/16
0
0
Guns 2.0 基于 SpringBoot 全面升级,做简洁的管理系统

Guns V2.0 新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + mybatis-plus + beetl! 在不用写xml配置(V1.0)的基础上进一步简化项目配置,让您更专注于业务开发!抛弃传统spring xm...

stylefeng
2017/05/26
7.9K
14
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
2018/12/15
64
0
springboot maven 多环境配置 jenking构建发布配置

在后端开发中,应用程序在不同的环境可能会有不同的配置,例如数据库连接、日志级别等,开发,测试,生产每个环境可能配置都不一致。 使用Spring Boot的Profile可以实现多场景下的配置切换,方...

Elson
2018/09/05
128
2

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
9分钟前
4
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
32分钟前
9
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
40分钟前
25
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
45分钟前
18
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
54分钟前
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部