Maven插件限制使用特定包

我在一个由大约40名开发人员组成的团队中工作,我不希望任何开发人员使用某些特定的API(确切地说是java.sun.Base64)供任何开发人员使用,而是让他们使用sun API的替代品作为其专有。

是否有任何maven插件,通过它,在pom.xml中指定受限制的包,如果在代码中的任何地方使用任何这些包,构建将会中断?

或者有更优雅的方式来做到这一点?

谢谢

您希望为项目定义体系结构规则,最好通过源代码分析来实施。

Sonar现在能够在项目的质量仪表板上指定此类规则并显示违规。 如果您希望构建中断,可以另外启用Sonar的Build breaker插件。

Sonar非常易于设置,并且可以集成到您的Maven构建过程中,而无需更改POM。

看看这个 :

 org.codehaus.mojo macker-maven-plugin 1.0.0-SNAPSHOT   compile  macker     

其中规则定义为不允许导入java.lang.System

      System out is bad. Use logging instead.      

这是我为类似目的编写的插件。

细节可以在这里看到: https : //github.com/yamanyar/restrict-maven-plugin/wiki

限制从com.ya *到java.util.regex的所有访问。*

 com.ya* to java.util.regex.* 

限制从com.ya *(com.yamanyar.core除外)到java.util.regex的所有访问

 com.ya*,!com.yamanyar.core.* to java.util.regex.* 

限制从com.ya *(com.yamanyar.core除外)和com.abc.Test到java.util.regex的所有访问

com.ya*,com.abc.Test,!com.yamanyar.core.* to 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.* to 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.* to java.util.regex.*,!java.util.regex.Matcher com.ya*,!com.yamanyar.core* to java.io.PrintStre*.print*() 

我不知道有一个Maven插件可以做到这一点,但我想你可以用方面做类似的事情(因此使用Maven / Aspectj插件)。 Aspectj具有可能有用的声明错误构造。 如果它检测到使用您的禁用类的切入点,则会引发错误。

另外http://www.eclipse.org/aspectj/doc/released/progguide/semantics-declare.html#warnings-and-errors

这种方法的一个限制是它是静态分析,因此无法捕获您的类/包黑名单的任何“聪明”调用。

您可以检查类加载器中加载了哪些类,如果从java.sun.Base64中找到某些内容,则会引发错误。

这似乎有效: http : //www.javaworld.com/javaworld/javaqa/2003-07/02-qa-0725-classsrc2.html

这是PMD / Maven PMD插件的概念certificate规则代码。 (受限制的类在构造函数中是硬编码的,但可以通过属性对其进行配置。)

 import java.util.Collections; import java.util.LinkedList; import java.util.List; import net.sourceforge.pmd.AbstractJavaRule; import net.sourceforge.pmd.ast.ASTClassOrInterfaceType; import net.sourceforge.pmd.ast.ASTName; import net.sourceforge.pmd.ast.SimpleJavaNode; public class PackageRestrictionRule extends AbstractJavaRule { private final List disallowedPackages; public PackageRestrictionRule() { final List disallowedPackages = new LinkedList(); disallowedPackages.add("org.apache."); this.disallowedPackages = Collections .unmodifiableList(disallowedPackages); } @Override public Object visit(final ASTClassOrInterfaceType node, final Object data) { checkPackage(node, data); return super.visit(node, data); } @Override public Object visit(final ASTName node, final Object data) { checkPackage(node, data); return super.visit(node, data); } private void checkPackage(final SimpleJavaNode node, final Object data) { final String image = node.getImage(); if (isDisallowedPackage(image)) { addViolationWithMessage(data, node, "Disallowed class or package: " + image); } } private boolean isDisallowedPackage(final String packageName) { for (final String disallowedPackageName : disallowedPackages) { if (packageName.startsWith(disallowedPackageName)) { return true; } } return false; } } 

为它创建一个新的maven项目,并将此项目用作项目中PMD插件的依赖项:

  org.apache.maven.plugins maven-pmd-plugin 2.5  1.6  packagerestrictionrule.xml     ... PackageRestrictionRule 0.0.1-SNAPSHOT    

此外,PMD插件需要适用于规则类的规则集XML文件。 PMD网站上有一个例子: http : //pmd.sourceforge.net/howtowritearule.html 。 只需将它放在PackageRestrictionRule项目的src / main / resources文件夹中,插件就会在类路径中找到它。

这个建议与“优雅”相反; 它是一个完整的kluge:它可能很简单,可以在构建的进程源阶段编写一些内容……你可以(例如)用一些(无效的Java)文本替换“sun.Base64”的任何情况表明问题。 这会导致构建至少失败。

一个简单的选择可以是使用’父’pom来定义所有第三方jar子,其中包含“依赖管理”部分中的版本,并在子poms中使用它们。 即使此模型不否认特定jar的使用,PM或架构师也可以通过简单的方法来管理依赖项。 完成后,我们可以简单地告诉开发人员只使用父pom中使用的依赖项。