Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven插件,用于限制特定软件包的使用_Java_Maven_Maven Plugin_Maven 3 - Fatal编程技术网

Java Maven插件,用于限制特定软件包的使用

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

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

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

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


谢谢

我不知道有什么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>