您的位置:首页 > 其它

pom.xml中配置plugin

2015-07-26 14:12 369 查看
一、plugin配置的等价类

参考《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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: