小编典典

Checkstyle规则,用于限制根软件包之间的交互(使用ImportControl?)

java

如何创建Checkstyle规则来限制不同根包之间的交互?

我有以下3个根软件包:

  • models
  • views
  • controllers

(它们 不是 类似的东西com.mycompany.myproject.models。它们是 根包 。)

我想禁止访问从modelsviewsviewsmodels(和其他一些)。

我尝试使用Checkstyle 的ImportControl-
Checker

  • 尝试1:使用一个import-control.xml。问题:我只能提供一个Root-XML-Element(<import-control pkg="models">),并且它只包含一个Package(但是我想拥有多个)。
  • 尝试2:使用多个import-control.xml。问题:如果我在中导入多个checkstyle-config.xml,似乎都不起作用(没有错误,就好像我都没有定义)。我的定义import-control.xml
    <module name="ImportControl">
    








阅读 263

收藏
2020-11-26

共1个答案

小编典典

不幸的是,要使用开箱即用的ImportControl复选框很难做到。
原因如下:

您已经发现了为什么选项1无法使用的原因:只能有一个根软件包。

选项2是可行的,但很费力。让我深入一点。我使用了以下两个导入控制文件,它们不允许使用modelsfrom viewsviewsfrom
models

<!DOCTYPE import-control PUBLIC "-//Puppy Crawl//DTD Import Control 1.1//EN"
    "http://www.puppycrawl.com/dtds/import_control_1_1.dtd">
<import-control pkg="views">
    <allow pkg="views" />
    <disallow pkg="models" />
</import-control>



<!DOCTYPE import-control PUBLIC "-//Puppy Crawl//DTD Import Control 1.1//EN"
    "http://www.puppycrawl.com/dtds/import_control_1_1.dtd">
<import-control pkg="models">
    <allow pkg="models" />
    <disallow pkg="views" />
</import-control>

在我的测试设置中,这基本上可以工作,但是有一个缺点:每个类都会收到Checkstyle警告,表明 Import控制文件无法处理此包
。这是因为ImportControl检查期望所有程序包都驻留在公共根目录下(通过查看Checkstyle
5.6源进行了验证)。因此,在models程序包中,您会从为views程序包配置的检查实例中得到警告,反之亦然。
还存在一个额外的问题,即ImportControl检查仅适用于import语句,但是找不到直接在代码中使用的完全限定的引用。

所以,你可以做什么?

  • 更改您的应用程序,以便拥有共同的根。这是最佳做法,通常是个好主意。
  • 实现自定义检查作为其子类,ImportControlCheck该子类添加用于启用/禁用 “导入控制文件无法处理此程序包” 消息的选项,否则请使用选项2。
  • 如果使用的是Eclipse,则还有第三个解决方案。您可以使用Checkstyle Eclipse插件提供的高级配置对话框,以将ImportControl实例限制为各自的文件。这也将消除 “导入控制文件无法处理此程序包” 消息。
2020-11-26