maven 不同环境打包

    很多时候,项目会分为,本地环境(local),测试环境(dev),生产环境(product),此时给项目打包,就会很麻烦,因为配置文件不同比如数据库链接,文件地址等,所以打包的时候需要修改配置文件,maven这里提供了很便利的操作,通过配置文件和命令就可以分别打出来不同的war包,在不同的环境中使用;


一、项目中resource下面需要区分一下,如下图,在resource中新建 dev  local  pro 文件夹,名字也可以自己根据自己习惯命名。

maven 不同环境打包

建立好目录后,可以把一些不同环境的配置各自放入到响应的文件夹,我的这个项目不同的配置有好几个,所以我在文件夹下面又分了子文件件,我的不同配置分为 数据库链接配置,还有web.xml 还有自己系统初始化的一些配置。

二、配置pom文件

pom文件里面添加 如下配置,和上面resource里面的配置相对应

<profiles>
  <profile>
    <id>local</id><!--本地环境-->
    <properties>
      <package.environment>local/config</package.environment>
      <webxml.environment>local/webxml</webxml.environment>
    </properties>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
  </profile>
  <profile>
    <id>pro</id><!--生产环境-->
    <properties>
      <package.environment>pro/config</package.environment>
      <webxml.environment>pro/webxml</webxml.environment>
    </properties>
  </profile>
  <profile>
    <id>dev</id><!--测试环境-->
    <properties>
      <package.environment>dev/config</package.environment>
      <webxml.environment>dev/webxml</webxml.environment>
    </properties>
  </profile>
</profiles>

 

编译时候添加如下配置,保证项目正常启动

<build>
  <finalName>csp</finalName>

  <resources>
    <resource>
      <directory>${basedir}/src/main/resources</directory>
      <!-- 资源根目录排除各环境的配置,防止在生成目录中多余其它目录 *一级目录 **包含子目录 -->
      <excludes>
        <exclude>local/**</exclude>
        <exclude>pro/**</exclude>
        <exclude>dev/**</exclude>
      </excludes>
      <filtering>true</filtering>
    </resource>
    <resource>
      <directory>${basedir}/src/main/resources/${package.environment}</directory>
      <filtering>true</filtering>
    </resource>
    <resource>
      <directory>${basedir}/src/main/resources/${webxml.environment}</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    <plugins>
      <!-- war打包插件 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <webResources>
            <!--动态指定文件-->
            <resource>
            <directory>src/main/resources/${package.environment}</directory>
            <targetPath>WEB-INF/classes</targetPath>
            <filtering>true</filtering>
           </resource>
            <resource>
              <directory>src/main/resources/${webxml.environment}</directory>
              <targetPath>WEB-INF</targetPath>
              <filtering>true</filtering>
            </resource>
          </webResources>
         <packagingExcludes>
            WEB-INF/classes/dev/**,WEB-INF/classes/pro/**,WEB-INF/classes/local/**,
            WEB-INF/classes/webxml/**
          </packagingExcludes>
        </configuration>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

 

在上面的配置中,

resources配置保证项目可以本地编译,支持本地debug,

其中 excludes标签是用来排除重复的内容,需要注意的是 * 代表一级目录 **代表包含子目录;

configuration标签设置打包的一些配置,其中: 

directory:定义了要进行打包的文件路径, 

targetPath: 打包的目录文件夹,即将文件打成war包的时候放到war包的此目录下 

filtering:在打包的时候是否将配置文件中的用${}表示的值给替换。

packagingExcludes是在生成war包时不包含指定文件或文件夹到war文件中,不论它们是否存在于war文件夹下。

 

这样就实现了不同环境的部署,方便项目上线测试;