现在有一个需求,要求所有web项目在上线前都得在一个properties文件里配有一个属性。假设需求是在每个web项目的WEB-INF\classes目录下的settingConfig.properties文件里需要有一个value值为login.jsp,key可以随意定义。我们的web项目有二、三十个,为避免马虎的同学没按照要求来,也为减少运维同学的工作量,我决定引入强制检查。我们在用maven,就自然的想到了enforcer这个插件。
上Maven Enforcer Plugin网站一查,果然没有直接可用的规则,那就自己写吧。
其实maven的插件机制还是挺不错的,它内部也用了一个IoC控制反转的框架,叫plexus,你自己编写的插件只要实现它提供的一个接口,外加几个注解即可搞定,这是Maven Enforcer Plugin的源码,一看就基本知道什么个意思:
@Mojo( name = "enforce", defaultPhase = LifecyclePhase.VALIDATE, threadSafe = true )
public class EnforceMojo
extends AbstractMojo
implements Contextualizable{
@Parameter( property = "enforcer.fail", defaultValue = "true" )
protected boolean fail = true;
//省略……
}
我呢,是增加Enforcer Plugin的一个规则,这就更简单了,引用它提供的jar包,实现它提供的org.apache.maven.enforcer.rule.api.EnforcerRule接口即可。官网的例子其实已经很详细了。链接在这儿
我实现的代码在下面,首先是两个公用类:
public abstract class AbstractStandardEnforcerRule implements EnforcerRule {
/**
* Specify a friendly message if the rule fails.
*/
private String message = null;
/**
* 是否跳过检查
*/
private boolean skip = false;
//getter and setter……
}
public abstract class AbstractNonCacheableEnforcerRule
extends AbstractStandardEnforcerRule{
/*
* @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
*/
public String getCacheId(){
return "0";
}
/*
* @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
*/
public boolean isCacheable(){
return false;
}
/*
* @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
*/
public boolean isResultValid( EnforcerRule cachedRule ){
return false;
}
}
这个是我定义的配置Bean,maven插件把xml到java Bean的转换都做了,太方便了。
public class RequirePropertyFileBean {
private String location;
private String property;
private String regex;
//getter and setter……
}
这三个属性一看便知意思。location是要检查的properties文件的路径,property是properti