文档章节

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

李玉珏
 李玉珏
发布于 2017/04/07 15:57
字数 1104
阅读 437
收藏 2

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

解决这个问题有很多的做法,比如构建两个工程,一个用于开发,一个用于版本发布,两个工程的pom是不同的,这样看上去也更符合软件开发的常规流程,另外,也可以考虑禁用maven默认的deloy过程,然后直接调用deploy:deploy-file单独部署某个文件。总之,不管怎样,办法肯定是有的。

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

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

<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文件,具体压缩策略如下:

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

在默认的压缩逻辑下,插件如何处理各种元素,可以看这里。 下面会重点介绍如何通过各种参数来控制压缩的过程:

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

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

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

具体可以看FlattenMode的javadoc。

© 著作权归作者所有

共有 人打赏支持
李玉珏

李玉珏

粉丝 289
博文 61
码字总数 103780
作品 0
沈阳
技术主管
Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)

以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/mavendeployment_automation.html: 注意:Maven自动构建和自动部署的区别在于,构建只是编译代码阶段,而部署...

easonjim
2017/05/15
0
0
Maven 快速指南(二)

使用指导 如何添加外部依赖jar包 在Maven工程中添加依赖jar包,很简单,只要在POM文件中引入对应的标签即可。 参考下例: 标签最常用的四个属性标签: :项目组织唯一的标识符,实际对应JAV...

静默虚空
2017/11/10
0
0
Maven实战读书笔记(14)

什么是版本管理? 版本管理是指项目整体版本的演变过程管理,如从1.0-SNAPSHOT到1.0再到1.1-SNAPSHOT 什么是版本控制? 版本控制是指借助版本控制工具(如Subversion)追踪代码的每一个变更 ...

祥林会跟你远走高飞
2014/12/24
0
0
Maven 插件介绍

maven-antrun-plugin http://maven.apache.org/plugins/maven-antrun-plugin/ maven-antrun-plugin能让用户在Maven项目中运行Ant任务。用户可以直接在该插件的配置以Ant的方式编写Target, ...

年少爱追梦
2016/10/07
8
0
Maven实战(七)——常用Maven插件介绍(上)

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一...

有事没事
2016/09/21
6
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
22分钟前
0
0
AVA中CAS-ABA的问题解决方案AtomicStampedReference

了解CAS(Compare-And-Swap) CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS。 JAVA中CAS的实现 JAVA中的cas主要使用的是...

码代码的小司机
24分钟前
0
0
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
37分钟前
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
今天
1
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部