使用flatten-maven-plugin对发布的POM进行精简

使用maven开发的模块化应用,能够发布出去供他人使用,好比各类开源库,使用时,要么是继承,要么是以依赖的形式引入。但咱们看各类库的pom.xml文件,一般都比较简单,通常只有一些必要的依赖信息,做为开发者,一般认为使用者也就须要这些信息。可是真正开发时,对应模块的pom可能比较复杂,可能要使用各类插件,引用各类依赖,组件间有继承关系,甚至根据不一样的参数走不一样的分支,即便用profile机制等,maven默认在部署时,会保留对应模块中的pom的全部信息,不会作改动。这样就给模块的发布带来了必定的麻烦,若是直接发布这样的pom.xml,是可能给使用者形成干扰的,出了问题又很难进行定位。html

解决这个问题有不少的作法,好比构建两个工程,一个用于开发,一个用于版本发布,两个工程的pom是不一样的,这样看上去也更符合软件开发的常规流程,另外,也能够考虑禁用maven默认的deloy过程,而后直接调用deploy:deploy-file单独部署某个文件。总之,无论怎样,办法确定是有的。java

而本文的目的,是想介绍一种新的方式,来优雅地解决这个问题,也许实际开发中并不须要这样作。git

具体作法是,使用社区专门针对这个问题开发的插件,即Maven Flatten Plugin,这个插件使用起来很是简单,以下:github

<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.0.0</version> <configuration> </configuration> <executions> <execution> <id>flatten</id> <phase>process-resources</phase> <goals> <goal>flatten</goal> </goals> </execution> </executions> </plugin> </plugins> 

这个插件的做用是,生成一个压缩版的pom.xml文件,而后在installdeploy阶段使用压缩后的pom.xml文件,替换原来的pom.xml文件,具体压缩策略以下:maven

  • 和构建有关的元素会被删除;
  • 和开发有关的元素默认会被删除;
  • 只包含构件的使用者必须的一些信息;
  • 变量会被解析;
  • 上级关系会被解析,而后被压缩删除;
  • 构建时实际使用的profile会被评估,视状况处理;
  • 由JDK或者OS驱动的profile会被保留,须要时能够动态地控制依赖。

在默认的压缩逻辑下,插件如何处理各类元素,能够看这里。 下面会重点介绍如何经过各类参数来控制压缩的过程:模块化

属性名 类型 描述
embedBuildProfileDependencies Boolean 由OS或者JDK的不一样而触发的profile,可能根据环境的不一样而产生不一样的依赖,可是由属性等触发的profile,就不肯定了,若是属性设置为true,profile中的依赖会直接写入生成的pom中,若是设置为false,全部的profile信息都会保留,默认是false
flattenMode FlattenMode 插件预约义了若干种压缩模式,下面会详述。
flattenedPomFilename String 生成的压缩后的pom.xml文件的文件名,默认为.flattened-pom.xml
outputDirectory File 生成的压缩后的pom.xml文件的存放位置,默认为${project.basedir}
pomElements FlattenDescriptor 该元素定义了如何处理额外的元素,若是可能,尽可能使用flattenMode,这个元素仅仅用于进一步提升灵活性,它能够控制具体的某个元素是保留仍是删除,好比要指定删除repositories,能够这样:<pomElements><repositories>flatten</repositories></pomElements>
updatePomFile Boolean 插件默认只会处理packaging属性为非pom的,若是要处理packagingpom的,可将本属性值设置为true

插件预约义了若干种模式,能够知足若干种常见的场景,这些模式定义在org.codehaus.mojo.flatten.FlattenMode枚举中,具体能够看代码,本文简单描述以下:ui

模式 描述
minimum 不推荐使用,会展开pluginRepositories
bom 会保留dependencyManagement,展开properties
oss 推荐开源项目使用,会展开ciManagementcontributorsdistributionManagementinceptionYearissueManagementmailingListsorganizationprerequisites
ossrh 会展开namedescriptionurlscmdevelopers
defaults 会展开repositories
clean 删除所有可选元素

具体能够看FlattenMode的javadoc。url

http://www.mojohaus.org/flatten-maven-plugin/examples/example-multiple-versions.htmlspa

相关文章
相关标签/搜索