Java Maven插件,用于限制特定软件包的使用
我在一个大约40名开发人员的团队中工作,我不希望任何开发人员使用任何开发人员使用的特定API(准确地说是java.sun.Base64),而是让他们使用sun API的替代品作为其专有技术 是否有maven的插件,通过这些插件,在pom.xml中指定受限制的包,如果这些包中的任何一个在代码中的任何地方被使用,构建将中断 或者有没有更优雅的方式来做到这一点Java Maven插件,用于限制特定软件包的使用,java,maven,maven-plugin,maven-3,Java,Maven,Maven Plugin,Maven 3,我在一个大约40名开发人员的团队中工作,我不希望任何开发人员使用任何开发人员使用的特定API(准确地说是java.sun.Base64),而是让他们使用sun API的替代品作为其专有技术 是否有maven的插件,通过这些插件,在pom.xml中指定受限制的包,如果这些包中的任何一个在代码中的任何地方被使用,构建将中断 或者有没有更优雅的方式来做到这一点 谢谢我不知道有什么Maven插件可以做到这一点,但我想你也可以用Aspect做类似的事情(因此使用Maven/Aspectj插件)。Aspec
谢谢我不知道有什么Maven插件可以做到这一点,但我想你也可以用Aspect做类似的事情(因此使用Maven/Aspectj插件)。Aspectj具有可能有用的构造。如果检测到使用禁止类的切入点,则会引发错误 也
这种方法的一个限制是它是静态分析,因此无法捕获类/包黑名单的任何“聪明”调用。您可以检查类加载器中加载了哪些类,如果从java.sun.Base64中发现了什么,则会引发错误
这似乎是可行的:您想为您的项目定义一个体系结构规则,最好通过源代码分析来实现 现在可以在项目的质量仪表板上指定和显示冲突。如果您希望构建中断,还可以启用Sonar的插件
Sonar非常容易设置,并集成到Maven构建过程中,POM的更改为零。此建议与“优雅”相反;这完全是一个难题:编写一些东西放在构建的过程源代码阶段可能足够简单。。。您可以(例如)用指示问题的一些(无效Java)文本替换“sun.Base64”的任何情况。这至少会导致生成失败。以下是/的概念验证规则代码。(受限类在构造函数中是硬编码的,但可以通过属性进行配置。)
import java.util.Collections;
导入java.util.LinkedList;
导入java.util.List;
导入net.sourceforge.pmd.AbstractJavaRule;
导入net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
导入net.sourceforge.pmd.ast.ASTName;
导入net.sourceforge.pmd.ast.SimpleJavaNode;
公共类PackageRestrictionRule扩展了AbstractJavaRule{
私人最终清单不允许的包;
公共包限制规则(){
final List disallowedPackages=new LinkedList();
disallowedPackages.add(“org.apache.”);
this.disallowedPackages=集合
.不可修改列表(不允许的包);
}
@凌驾
公共对象访问(最终ASTClassOrInterfaceType节点,
最终目标数据){
检查包(节点、数据);
返回超级访问(节点、数据);
}
@凌驾
公共对象访问(最终ASTName节点,最终对象数据){
检查包(节点、数据);
返回超级访问(节点、数据);
}
专用void checkPackage(最终SimpleJavaNode节点,
最终目标数据){
最后一个字符串image=node.getImage();
如果(isDisallowedPackage(图像)){
addViolationWithMessage(数据、节点、,
“不允许的类或包:”+图像);
}
}
私有布尔值isDisallowedPackage(最终字符串packageName){
for(最终字符串disallowedPackageName:disallowedPackages){
if(packageName.startsWith(不允许的packageName)){
返回true;
}
}
返回false;
}
}
为其创建一个新的maven项目,并将此项目用作项目中PMD插件的依赖项:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>2.5</version>
<configuration>
<targetJdk>1.6</targetJdk>
<rulesets>
<ruleset>packagerestrictionrule.xml</ruleset>
</rulesets>
</configuration>
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>PackageRestrictionRule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
org.apache.maven.plugins
. 只要将它放在PackageRestrictionRule项目的src/main/resources文件夹中,插件就会在类路径中找到它。查看:
org.codehaus.mojo
macker maven插件
1.0.0-SNAPSHOT
编译
麦克尔
其中规则定义为不允许导入java.lang.System
<?xml version="1.0"?>
<macker>
<ruleset name="Testing rules">
<pattern name="mypackage" class="org.codehaus.mojo.**" />
<access-rule>
<message>System out is bad. Use logging instead.</message>
<deny>
<to>
<include class="java.lang.System" />
</to>
</deny>
<!--allow>
<from pattern="blah" />
</allow-->
</access-rule>
</ruleset>
</macker>
系统出问题了。改用日志记录。
这是我为类似目的编写的插件
详情如下:
限制从com.ya*到java.util.regex的所有访问*
<restriction>com.ya* to java.util.regex.*</restriction>
com.ya*到java.util.regex*
限制从com.ya*(com.yamanyar.core除外)到java.util.regex的所有访问
com.ya*,!com.yamanyar.core.*到java.util.regex*
限制从com.ya*(com.yamanyar.core除外)和com.abc.Test到java.util.regex的所有访问
com.ya*,com.abc.Test,!com.yamanyar.core.*到java.util.regex.*
限制从com.ya*(com.yamanyar.core除外)和com.abc.Test到java.util.regex的所有访问。(除了java.util.regex.Matcher)com.ya*,com.abc.Test,!com.yamanyar.core.*到java.util.regex.*,!java.util.regex.Matcher
限制从com.ya*(com.yamanyar.core除外)和com.abc.Test到java.util.regex的所有访问。(java.util.regex.Matcher除外);并将com.ya*(com.yamanyar.core除外)限制为java.io.PrintStre.print*()
com.ya*,com.abc.Test,!com.yamanyar.core.*到java.util.regex.*,!java.util.regex.Matcher
com.ya*,!com.yamanyar.core*到java.io.PrintStre*.print*()
一个简单的选择是使用“父”pom在“依赖项管理”部分定义所有版本的第三方JAR,并在子pom中使用它们。即使此模型不拒绝使用特定的jar,PM或架构师也可以轻松地管理依赖项。完成后,我们可以简单地告诉开发人员只使用父级中使用的依赖项
<?xml version="1.0"?>
<macker>
<ruleset name="Testing rules">
<pattern name="mypackage" class="org.codehaus.mojo.**" />
<access-rule>
<message>System out is bad. Use logging instead.</message>
<deny>
<to>
<include class="java.lang.System" />
</to>
</deny>
<!--allow>
<from pattern="blah" />
</allow-->
</access-rule>
</ruleset>
</macker>
<restriction>com.ya* to java.util.regex.*</restriction>
<restriction>com.ya*,!com.yamanyar.core.* to java.util.regex.*</restriction>
<restriction>com.ya*,com.abc.Test,!com.yamanyar.core.* to java.util.regex.*,!java.util.regex.Matcher</restriction>
<restriction>com.ya*,!com.yamanyar.core* to java.io.PrintStre*.print*()</restriction>