Maven|Maven jar profile 多环境

简言 为了减少开发人员反复修改配置,考虑在旧项目(非springboot)中使用 maven profile,在此记录下实现过程。
修改记录

  1. 之前直接使用 POM 中的 标签来控制文件覆盖不稳定,时灵时不灵。导致测试、生产环境jar包内配置文件不正确。现在纠正为使用resource插件,如果给读到的读者带来了疑惑,请多谅解。
  2. 由 copy-resource 改为 antrun。
实现过程 1.profiles 在pom文件中加入profiles配置。根据项目的需要,我配置3个profile节点,分别对应开发、测试和生产3种环境。代码如下:
defaultsrc/main/filters/conf/local truetestsrc/main/filters/conf/test productionsrc/main/filters/conf/production

简单解释下代码中各个节点:
  1. id节点自定义,定义什么,使用打包命令时就用什么。如test,打包时就是用mvn package -Ptest
  2. properties下属子节点自定义,名称自定义,结合下文中的 使用。子节点多少视项目实际情况而定。
  3. activation 缺省设置,如果直接使用mvn package时,默认会使用defaule节点下的配置文件。如果不设置此节点,那么使用打包命令时需要显示执行id。
加入这段代码的目的是:在打包时,将目标环境对应目录下的配置文件覆盖项目原有的配置文件,以此来达到自动修改文件。举例说明下,通过mvn package -Ptest打包,目标环境为test。那么在打包的时候,会使用test定义的目录,即src/main/filters/conf/test。然后,会将该目录下的配置文件覆盖项目原有的配置文件。
2.build 定义过 profiles 后,就需要定义 build 节点内容了。两者的关系就是后者调用前者。
${project.artifactId}-${project.version} src/main/java src/main/resources db/* *config.properties *spring.xml src/main/filters conf/local/* conf/production/* conf/test/* maven-resources-plugin 3.1.0 copy-resourcesprepare-package copy-resources ${basedir}/target/classes ${package.environment.conf} true

2.1 copy-resource
下面的代码就是对 profiles 节点定义内容的调用:
prepare-package copy-resources ${basedir}/target/classes ${package.environment.conf} true

${package.environment.conf} 配置就是打包命令中指定的profile节点中定义属性的目录。举个例子:
“mvn package -Ptest”,使用此打包命令时,会先去找对应的profile节点,即:
testsrc/main/filters/conf/test

找到节点后,${package.environment.conf} 会引用 package.environment.conf 所定义的内容,即:src/main/filters/conf/test
2.2 phase
翻译为阶段,即在什么时候将 test 环境下的文件覆盖原来的配置文件,在这里为了保证打包时能选择正确的配置文件,设置为打包准备阶段,即 prepare-package
2.3 outputDirectory
就是目标文件夹,即要将src/main/filters/conf/test目录下的文件,放到${basedir}/src/main/resources下,${basedir} 就是项目文件夹的根路径。
2.4 copy-resource 改为 antrun
项目背景 项目达成jar包后,被其他项目模块引用了。所以使用 IDEA 时需要开启 maven 委托,maven 配置才能生效,打包时间略长且不能使用 JRebel,给开发带来不便。所以根据实际需要改为使用 antrun 插件的 copy 来达到相同的目的。
org.apache.maven.plugins maven-antrun-plugin prepare-copy-resourcespackage run

结语 【Maven|Maven jar profile 多环境】至此,项目工程打包时,通过指定profile自动修改配置文件的目的已经实现。

    推荐阅读