2017-04-07 73 views
1

当应用程序需要查询远程系统时,我们经常创建一个“远程”包,并带有一个“实体”子包,其中包含的类将更容易处理我们检索的信息。这些类不应该泄漏出远程包。检查非法进口remote.entities远程包

是否有任何规则可用(或正在研究中)检查是否在x.y.remote包之外导入x.y.remote.entities?

+0

相关性矩阵视图本来的好帮助,这可惜这个功能被删除在最新版本的 – Coc

回答

1

从您的问题标签中,我发现基于Checkstyle的解决方案对您也有帮助。 ImportControl检查应该只是你需要的。如果您需要,Checkstyle还具有SonarQube plugin

+0

当然,ImportControl规则有助于检查禁止的类的使用情况。但是这个规则也会引发对x.y.remote包中使用的x.y.remote.entities的违反。有关如何配置此规则来检查x.y.remote包之外的使用情况,但不在里面的任何想法。 – Coc

1

S3688被添加到SonarJava 4.4中,完全禁止使用某些类。在它的表面上,这是行不通的,因为想要允许在某些包中使用这些类。这就是Issue Exclusions进来。

您可以设定规则来禁止使用的x.y.remote.entities(通用),然后建立一个排除忽略来自该规则在x.y.remote上的任何内容提出的问题。

+0

这个规则看起来挺有意思的进一步调查。但是自从哪个版本的Java是可用的这个规则。我们正在使用Java 3.9,但我无法找到这个规则。 – Coc

+0

请参阅我的编辑@Coc。顺便说一句,你应该考虑升级。 3.9已经超过一岁了。自那时以来,已经有许多改进。当前版本是4.8。 –

0

PMD的主要优点之一是,它可以通过编写简单的XPath表达式,轻松编写非常特定于给定项目/团队的自定义规则,就像这一个一样。

在规则集的XML文件,只需添加您的自定义规则如下:

<rule name="Remote entities used outside remote package" 
     message="The remote entities should not be imported outside the remote package" 
     class="net.sourceforge.pmd.lang.rule.XPathRule" 
     language="java"> 
    <description> 
     Remote entities should not be imported outside the remote package 
    </description> 
    <priority>3</priority> 
    <properties> 
     <property name="xpath"> 
      <value> 
    //ImportDeclaration/Name[contains(@Image, '.entities') and //PackageDeclaration/Name[not(contains(@Image, '.remote'))]] 
      </value> 
     </property> 
    </properties> 
</rule> 

注意,因为它代表允许从任何远程包被导入的所有实体规则,但using the designer你很可能重复这一规则尽可能多地缩小它的范围。在早期版本的Sonarqube的

+0

我不确定编写规则来实现我们的方案是多么容易。我会试一试,并在需要时回复您的澄清。再次感谢您的答复。 – Coc