中国领先的IT技术网站
|
|
创建专栏

常用maven插件总结

maven是目前java项目中比较流行的构建工具,特别是它提供的插件,如果使用得当,整个项目研发流程都将会受益,从而提高研发、测试和部署的效率。这里记录几个常用插件的用法,既方便自己日后回顾,也便于有兴趣的同仁交流指正。

作者:崔莹峰|2017-03-29 11:20

开发者大赛路演 | 12月16日,技术创新,北京不见不散


maven是目前java项目中比较流行的构建工具,特别是它提供的插件,如果使用得当,整个项目研发流程都将会受益,从而提高研发、测试和部署的效率。这里记录几个常用插件的用法,既方便自己日后回顾,也便于有兴趣的同仁交流指正。各位实践过程中如果发现有趣的插件或者更好的用法,也欢迎留言分享。

Maven工程标准架构

插件一 maven-resources-plugin

Maven可以区别对待Java代码文件和资源文件,默认的主资源文件目录是src/main/resources,我们可以通过这个插件实现资源文件过滤。资源文件过滤的意思是指我们可以在资源文件里用使用占位符${propertyName},然后开启对资源文件的过滤,pom.xml里再统一设置所有{propertyName}对应的值,就可以在构建过程中将值替换掉资源文件中对应的${propertyName},实现了代码配置分离、做到了参数的统一维护。

示例用法

  1. <resources> 
  2.     <resource> 
  3.         <directory>src/main/resources</directory> 
  4.         <includes> 
  5.             <include>properties/*.properties</include> 
  6.         </includes> 
  7.         <filtering>true</filtering> 
  8.     </resource> 
  9.     <resource> 
  10.         <directory>src/main/resources</directory> 
  11.         <includes> 
  12.             <include>*.xml</include> 
  13.             <include>mapper/**/*.xml</include> 
  14.             <include>mysqlMapper/**/*.xml</include> 
  15.             <include>*.properties</include> 
  16.         </includes> 
  17.     </resource> 
  18. </resources> 
  19. …… 
  20. <properties> 
  21.     <runtime.env>local</runtime.env> 
  22. </properties> 

我们的主应用集成后,会根据实际要求部署到不同的环境中,比如联调环境、测试环境、压力环境、预发布环境、生产环境等,而这些环境上的资源配置信息显然是不一样的,针对每套环境,每个具体占位符${propertyName}都会有不同的值,而这种场景可以使用Maven的profile来支持,每个profile都可以独立维护一套参数值,在mvn package的时候灵活指定;此外,maven也支持在package的时候指定多个profile,这个特性在执行自动部署的时候特别有用。使用这个插件,我们的项目可以做到多环境支持,参考命令

  1. mvn package -Pnocheck,env-test 

示例用法

  1. <profiles> 
  2.     <profile> 
  3.         <id>nocheck</id> 
  4.         <properties> 
  5.             <skipTests>true</skipTests> 
  6.             <checkstyle.skip>true</checkstyle.skip> 
  7.             <license.skip>true</license.skip> 
  8.             <notice.skip>true</notice.skip> 
  9.             <versions.skip>true</versions.skip> 
  10.         </properties> 
  11.     </profile> 
  12.     <profile> 
  13.         <!-- 本地环境,默认是windows --> 
  14.         <id>local</id> 
  15.         <activation> 
  16.             <activeByDefault>true</activeByDefault> 
  17.         </activation> 
  18.         <properties> 
  19.             <runtime.env>local</runtime.env> 
  20.         </properties> 
  21.     </profile> 
  22.     <profile> 
  23.         <id>env-test</id> 
  24.         <properties> 
  25.             <runtime.env>env-test</runtime.env> 
  26.         </properties> 
  27.     </profile> 
  28. </profiles> 

插件二 maven-jar-plugin

当我们将项目模块化后,有一些通用的资源文件基本上大多数模块都会用到,比如log4j.properties,jdbc.properties等,模块中有了这些资源文件,我们才能单独对该模块进行开发、调试。默认情况下maven-jar-plugin会将这些资源文件全部package成一个jar包进行发布,如果这样的jar包集成到一个主应用中部署,运行,很可能导致主应用的配置不生效,我称之为配置混乱,为了解决这个问题,可以开启maven-jar-plugin的排除功能,在执行mvn package之前排除指定的资源文件。

示例用法

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-jar-plugin</artifactId> 
  4.     <configuration> 
  5.         <excludes> 
  6.             <exclude>applicationContext.xml</exclude> 
  7.             <exclude>properties/**</exclude> 
  8.             <exclude>log4j.properties</exclude> 
  9.         </excludes> 
  10.     </configuration> 
  11. </plugin> 

插件三 maven-war-plugin

项目如果是web主应用,我们可以使用maven-war-plugin来对webapps下各类文件进行过滤。用法参考maven-resources-plugin

示例用法

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-war-plugin</artifactId> 
  4.     <configuration> 
  5.         <warName>demo-Rest</warName> 
  6.         <webResources> 
  7.             <resource> 
  8.                 <directory>src/main/webapp/WEB-INF</directory> 
  9.                 <filtering>true</filtering> 
  10.                 <targetPath>WEB-INF</targetPath> 
  11.                 <includes> 
  12.                     <include>web.xml</include> 
  13.                 </includes> 
  14.             </resource> 
  15.         </webResources> 
  16.     </configuration> 
  17. </plugin> 

插件四 properties-maven-plugin

随着项目的不断迭代,我们的资源配置项将会变得更多,这个会直接影响到pom.xml的体积膨胀;此外,如果项目目标部署环境比较多,pom.xml将会膨胀得更快,更加难以维护。为了解决这个问题,我们需要将这些配置信息独立出来,并按照不同环境进行归类,使用properties-maven-plugin就会达到这个效果。

示例用法(将每个环境的信息放在不同的目录下,然后在mvn package切换不同的profile实现去指定目录读取配置信息,用读取到的value去替换资源配置文件的占位符)

  1. <plugin> 
  2.     <groupId>org.codehaus.mojo</groupId> 
  3.     <artifactId>properties-maven-plugin</artifactId> 
  4.     <version>1.0.0</version> 
  5.     <configuration> 
  6.         <files> 
  7.             <file>profiles/${runtime.env}/jdbc.properties</file> 
  8.             <file>profiles/${runtime.env}/redis.properties</file> 
  9.             <file>profiles/${runtime.env}/batch.properties</file> 
  10.             <file>profiles/${runtime.env}/config.properties</file> 
  11.         </files> 
  12.     </configuration> 
  13.     <executions> 
  14.         <execution> 
  15.             <phase>initialize</phase> 
  16.             <goals> 
  17.                 <goal>read-project-properties</goal> 
  18.             </goals> 
  19.         </execution> 
  20.     </executions> 
  21. </plugin> 

插件五 maven-assembly-plugin

Java项目中有一种类型的主应用,是需要独立部署在后台启动的,比如socket服务程序,比如定时调度程序,比如dubbo服务程序,这些程序理论上只需要执行一个简单的java命令即可;稍微复杂一些的,我们可以规范一下自己的主应用结构,定义配置文件夹和依赖库文件夹,再准备启动的批处理脚本sh或bat文件即可。使用maven-assembly-plugin就可以达到这种效果。

示例用法

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-assembly-plugin</artifactId> 
  4.     <configuration> 
  5.         <appendAssemblyId>false</appendAssemblyId> 
  6.         <descriptors> 
  7.             <descriptor>target/classes/package.xml</descriptor> 
  8.         </descriptors> 
  9.     </configuration> 
  10.     <executions> 
  11.         <execution> 
  12.             <id>make-assembly</id> 
  13.             <phase>package</phase> 
  14.             <goals> 
  15.                 <goal>single</goal> 
  16.             </goals> 
  17.         </execution> 
  18.     </executions> 
  19. </plugin> 

附package.xml

  1. <assembly 
  2. xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"
  5.     <id>package</id> 
  6.     <formats> 
  7.         <format>tar.gz</format> 
  8.     </formats> 
  9.     <includeBaseDirectory>true</includeBaseDirectory> 
  10.     <fileSets> 
  11.         <fileSet> 
  12.             <directory>src/main/bin</directory> 
  13.             <includes> 
  14.                 <include>*.sh</include> 
  15.                 <include>*.bat</include> 
  16.             </includes> 
  17.             <filtered>true</filtered> 
  18.             <outputDirectory></outputDirectory> 
  19.             <fileMode>0755</fileMode> 
  20.         </fileSet> 
  21.         <fileSet> 
  22.             <directory>${basedir}/src/main/config</directory> 
  23.             <includes> 
  24.                 <include>*.properties</include> 
  25.                 <include>log4j.xml</include> 
  26.             </includes> 
  27.             <outputDirectory>config</outputDirectory> 
  28.             <filtered>true</filtered> 
  29.             <fileMode>0644</fileMode> 
  30.         </fileSet> 
  31.         <fileSet> 
  32.             <directory>${basedir}/src/main/config</directory> 
  33.             <includes> 
  34.                 <include>log4j.dtd</include> 
  35.             </includes> 
  36.             <outputDirectory>config</outputDirectory> 
  37.             <fileMode>0644</fileMode> 
  38.         </fileSet> 
  39.     </fileSets> 
  40.     <dependencySets> 
  41.         <dependencySet> 
  42.             <outputDirectory>lib</outputDirectory> 
  43.             <scope>runtime</scope> 
  44.             <fileMode>0644</fileMode> 
  45.         </dependencySet> 
  46.     </dependencySets> 
  47. </assembly> 

附示例生成的Java应用结构图

插件六 maven-shade-plugin

有时候,我们需要将所有配置文件和依赖库文件全部放在一个jar包中,运维的同事只需要执行java -jar batch.jar即可完成启动。虽然使用maven-assembly-plugin也可以做到这一点,但是在读取配置文件的时候有可能会遇到一些问题,这个时候,我们可能需要使用到maven-shade-plugin这个插件,经笔者实践按照如下示例用法配置确实可用;当然本示例配置了mainClass,直接执行java -jar batch.jar确实没问题,但如果执行java com.fastjrun.demospring4.BatchInit -classpath batch.jar也是可以的。

示例用法

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-shade-plugin</artifactId> 
  4.     <version>3.0.0</version> 
  5.     <executions> 
  6.         <execution> 
  7.             <phase>package</phase> 
  8.             <goals> 
  9.                 <goal>shade</goal> 
  10.             </goals> 
  11.             <configuration> 
  12.                 <finalName>batch</finalName> 
  13.                 <shadedArtifactAttached>true</shadedArtifactAttached> 
  14.                 <shadedClassifierName>jar-with-dependencies</shadedClassifierName> 
  15.                 <transformers> 
  16.                     <transformer 
  17.                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"
  18.                         <mainClass>com.fastjrun.demospring4.BatchInit</mainClass> 
  19.                     </transformer> 
  20.                     <transformer 
  21.                         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"
  22.                         <resource>META-INF/spring.handlers</resource> 
  23.                     </transformer> 
  24.                     <transformer 
  25.                         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"
  26.                         <resource>META-INF/spring.schemas</resource> 
  27.                     </transformer> 
  28.                     <transformer 
  29.                         implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"
  30.                         <resource>META-INF/spring.tooling</resource> 
  31.                     </transformer> 
  32.                 </transformers> 
  33.                 <filters> 
  34.                     <filter> 
  35.                         <artifact>*:*</artifact> 
  36.                         <excludes> 
  37.                             <exclude>META-INF/*.SF</exclude> 
  38.                             <exclude>META-INF/*.DSA</exclude> 
  39.                             <exclude>META-INF/*.RSA</exclude> 
  40.                         </excludes> 
  41.                     </filter> 
  42.                 </filters> 
  43.             </configuration> 
  44.         </execution> 
  45.     </executions> 
  46. </plugin> 

插件七 versions-maven-plugin

当项目模块化后,我们会遇到一个问题,就是项目版本升级的时候,需要同时变更父模块和所有子模块中的版本号 ,而这是一个比较琐碎且容易出错的事情,还好maven考虑得很周到,提供了这样一个插件,我们使用命令行就可以达到效果了。我们的项目视图如下


参考命令如下

  1. mvn versions:set -DnewVersion=1.2-SNAPSHOT 

总结

本文汇总了笔者常用的几个插件及其用法,经实践,基于eclipse的kepler、luna版本都能很好支持maven-resources-plugin、maven-jar-plugin、maven-war-plugin和properties-maven-plugin使用,同时也支持profile的activeByDefault设置,研发同事在不需要任何调整的情况下就能直接开发、调试代码,且在开发结束后,可以直接使用mvn命令打包,打出各个环境的部署程序。从开发、调试、测试、验证到上线的整个过程,所有模块的pom.xml直到下一个迭代变更版本前都不用修改,直接使用。

【本文为51CTO专栏作者“崔莹峰”的原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

【编辑推荐】

  1. 累并快乐着——一个开发者的2016年总结
  2. MySQL数据库移植总结
  3. 深度 | 自然语言处理领域深度学习研究总结:从基本概念到前沿成果
  4. Linux网络故障排查总结
  5. 唯品会敏捷Scrum实践历程总结(四)
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

热门职位+更多