pom.xml中配置plugin
2015-07-26 14:12
369 查看
一、plugin配置的等价类
参考《XML文件与等价类》[1],根据maven-4.0.0.xsd[2],可得plugin配置的等价类如下:
二、如何获取最终有效的pom.xml内容
Maven项目中,获取最终有效的pom.xml内容的命令:mvn help:effective-pom
三、从plugin配置的等价类角度来理解配置原理
经过不断测试,通过"mvn help:effective-pom"获取最终有效的pom.xml内容,本人推断Maven关于plugin配置的配置原理如下:(只是个人理解,有错误请大家指正)
1)两个等价类实例之间有两种关系:一是处于同层级,即两个等价类实例在同一个pom.xml文件中定义;二是处于祖先后代层级,即一个等价类实例在祖先pom.xml文件中定义,另外一个等价类实例在后代pom.xml文件中定义
2)在同层级中的等价类实例:不允许作为plugin配置的唯一标识符的"groupId:artifactId"一致,如果一致,较后定义的等价类实例作为有效等价类实例,覆盖较前定义的等价类实例;否则,我们就定义了两个等价类实例
3)不同层级中的等价类实例:
如果两个等价类实例的"groupId:artifactId"不一致,那么我们定义了两个等价类实例;
如果两个等价类实例的"groupId:artifactId"一致,那么Maven会进行两个等价类实例的合并的过程,具体策略遵循《pom.xml中的通用合并策略》[3],这里用代码表示如下:
参考文献:
[1]http://blog.csdn.net/dslztx/article/details/47065301
[2]http://maven.apache.org/xsd/maven-4.0.0.xsd
[3]http://blog.csdn.net/dslztx/article/details/47067667
[4]http://maven.apache.org/pom.html#Plugins
参考《XML文件与等价类》[1],根据maven-4.0.0.xsd[2],可得plugin配置的等价类如下:
import java.util.List; import java.util.Map; /** * <plugins>标签下<plugin>标签内容的等价类 */ public class Plugin { /** * 插件的groupId */ String groupId; /** * 插件的artifactId */ String artifactId; /** * 插件版本 */ String version; /** * 是否允许加载插件支持的Packaging类型 */ Boolean extensions = false; /** * 加载插件需要的依赖包列表 */ List<Dependency> dependencies; /** * 配置"phase-goals"绑定关系,绑定关系中的goal由本插件提供 */ List<Execution> executions; /** * true/false,表示是否允许"configuration"对"继承于本插件的插件"可见 */ String inherited = "true"; /** * 关于插件的配置,不同插件需要配置的参数不同 */ Map<String, Object> configuration; } /** * <dependency>标签内容等价类 */ class Dependency { } /** * <execution>标签内容等价类 */ class Execution { /** * "phase-goals"绑定关系配置的唯一标识符 */ String id; /** * "phase-goals"绑定关系中的phase */ String phase; /** * "phase-goals"绑定关系中的goals,goals中的goal由关联插件提供 */ List<String> goals; /** * true/false,是否允许"configuration"对"继承于本Execution的Execution可见" */ String inherited = "true"; /** * "phase-goals"绑定关系配置中的其他参数配置 */ Map<String,Object> configuration; }
二、如何获取最终有效的pom.xml内容
Maven项目中,获取最终有效的pom.xml内容的命令:mvn help:effective-pom
三、从plugin配置的等价类角度来理解配置原理
经过不断测试,通过"mvn help:effective-pom"获取最终有效的pom.xml内容,本人推断Maven关于plugin配置的配置原理如下:(只是个人理解,有错误请大家指正)
1)两个等价类实例之间有两种关系:一是处于同层级,即两个等价类实例在同一个pom.xml文件中定义;二是处于祖先后代层级,即一个等价类实例在祖先pom.xml文件中定义,另外一个等价类实例在后代pom.xml文件中定义
2)在同层级中的等价类实例:不允许作为plugin配置的唯一标识符的"groupId:artifactId"一致,如果一致,较后定义的等价类实例作为有效等价类实例,覆盖较前定义的等价类实例;否则,我们就定义了两个等价类实例
3)不同层级中的等价类实例:
如果两个等价类实例的"groupId:artifactId"不一致,那么我们定义了两个等价类实例;
如果两个等价类实例的"groupId:artifactId"一致,那么Maven会进行两个等价类实例的合并的过程,具体策略遵循《pom.xml中的通用合并策略》[3],这里用代码表示如下:
import java.util.HashMap; import java.util.Map; public class Main { /** * 在"ancestor.groupId.equals(offspring.groupId) && ancestor.artifactId.equals(offspring.artifactId)"的情况下,调用本方法 * * @param ancestor * @param offspring * @return */ public Plugin merge(Plugin ancestor, Plugin offspring) { Plugin result = new Plugin(); // 简单属性 // 设置version值,后代等价类实例中的version值在不为空的情况下,比祖先等价类实例中的version值具有高优先级 if (isNotBlank(ancestor.version)) result.version = ancestor.version; if (isNotBlank(offspring.version)) result.version = offspring.version; // 设置extensions值,后代等价类实例中的extensions值在不为空的情况下,比祖先等价类实例中的extensions值具有高优先级 if (ancestor.extensions != null) result.extensions = ancestor.extensions; if (offspring.extensions != null) result.extensions = offspring.extensions; // List属性 // 合并ancestor的dependencies和offspring的dependencies,合并两个List的内容时,会递归调用通用合并策略,最后结果赋值给result.dependencies // 合并ancestor的executions和offspring的executions,合并两个List的内容时,会递归调用通用合并策略,最后结果赋值给result.executions // Map属性 // 设置configuration值 Map<String, Object> mapResult = new HashMap<String, Object>(); if (ancestor.inherited.equals("true")) { for (Map.Entry<String, Object> entry : ancestor.configuration.entrySet()) mapResult.put(entry.getKey(), entry.getValue()); } for (Map.Entry<String, Object> entry : offspring.configuration.entrySet()) mapResult.put(entry.getKey(), entry.getValue()); // 全局的configuration跟局部的configuration进行合并,局部的configuration具有高优先级 for (Execution execution : result.executions) { Map<String, Object> tmp = new HashMap<String, Object>(); for (Map.Entry<String, Object> entry : mapResult.entrySet()) tmp.put(entry.getKey(), entry.getValue()); for (Map.Entry<String, Object> entry : execution.configuration.entrySet()) tmp.put(entry.getKey(), entry.getValue()); execution.configuration = tmp; } return result; } /** * 是否不为空 * * @param version * @return */ private boolean isNotBlank(String version) { if (version != null && !"".equals(version)) return true; return false; } }
参考文献:
[1]http://blog.csdn.net/dslztx/article/details/47065301
[2]http://maven.apache.org/xsd/maven-4.0.0.xsd
[3]http://blog.csdn.net/dslztx/article/details/47067667
[4]http://maven.apache.org/pom.html#Plugins
相关文章推荐
- iOS学习之 plist文件的读写
- hdu 3681The King’s Problem(强连通分量+最小路径覆盖)
- Project Euler:Problem 92 Square digit chains
- 获取网络连接名称“本地连接”的两种方法
- DNS基本原理与配置
- Unicode字符列表(超完整)
- 最简单的汇编程序
- View事件传递 touch事件分发
- Server Tomcat v7.0 Server at localhost failed to start
- Javascript Ajax技术运用
- iOS中几种数据持久化方案:我要永远地记住你!
- 最短路默写
- poj 3259 Wormholes(Bellman-Ford)
- 树
- Apache不记录指定文件类型
- ios coredata的用法和利弊
- httpClient模拟登陆校内某系统
- GridView+DiskLruCache+LruCache+ViewPage显示图片效果
- 内存分配(堆、栈、BSS、代码段、数据段) --分析
- [转]STRUTS2中的OGNL