Java中的体系结构约束

Java中的体系结构约束,java,maven,architecture,Java,Maven,Architecture,我希望确保我的项目不包含包之间不必要的依赖关系。例如,我希望确保项目具有分层结构。也就是说,模型低于一切,业务逻辑依赖于模型,视图依赖于业务逻辑和模型。每个层都放在自己的包中 您能推荐一些开放源码的工具吗?这些工具允许我指定这些约束,并将它们作为持续集成的一部分进行检查 另外,我知道我可以在单独的maven模块中分离项目。不幸的是,我的实际情况比三层系统更复杂。如果我使用maven模块,我会有几十个非常小的模块。可以分析您的代码库,并为您提供所需的指标。您正在寻找的三个主要指标是传入耦合、传出耦

我希望确保我的项目不包含包之间不必要的依赖关系。例如,我希望确保项目具有分层结构。也就是说,模型低于一切,业务逻辑依赖于模型,视图依赖于业务逻辑和模型。每个层都放在自己的包中

您能推荐一些开放源码的工具吗?这些工具允许我指定这些约束,并将它们作为持续集成的一部分进行检查

另外,我知道我可以在单独的maven模块中分离项目。不幸的是,我的实际情况比三层系统更复杂。如果我使用maven模块,我会有几十个非常小的模块。

可以分析您的代码库,并为您提供所需的指标。您正在寻找的三个主要指标是传入耦合传出耦合包依赖周期


是另一个可能在这里有所帮助的工具。

尽管我不确定是否有可能对层依赖关系冲突强制执行生成失败,但至少有一个工具可以检查并可视化这些层:。您可以将它与maven和jenkins构建以及eclipse(可能还有其他IDE)集成

Sonar具有一个可视化软件包之间相互依赖关系的功能


编辑:似乎可以将sonar配置为强制构建因冲突触发而失败:

允许您将层可视化定义为单元,其中映射到物理代码并检查一致性。这些图在开发人员的IDE中可见,如果违反分层规则,则会生成编辑时警告。也可以在CI期间中断/报告生成。和是用于可视化依赖关系控制的其他工具

您可以使用Checkstyle实现“自定义检查”。查看以了解更多信息:


我自己没有尝试过,但我认为它不难实现,而且是免费的。

这是一个非常有效的问题,因为许多项目通过Maven模块强制实施依赖关系,这是对生产力和灵活性的巨大浪费

在花费大量时间研究这一主题后,我可以推荐两种工具:

  • Macker()它有Maven插件
  • Classycle()它必须使用Ant插入
这两种工具在过去几年都没有太大的发展,但都运行良好。Macker有基于XML的语法,但ClassCycle有整洁的DSL。ClassCycle是更高级的专用工具,具有层的概念。这些工具允许您在包和某些类类型之间实施严格的隔离。此工具应在构建过程中配置为在任何约束条件下立即失败

检查此处()和此处()的分层示例

一个好的开源工具仍然有一个合适的位置,它可以挂接到编译器中,当您在IDE中而不是在构建工具中时,它会给您带来错误。功能更加丰富,但也非常繁重,并且依赖于Eclipse插件

更新


这些也是非常强大的,但需要花费相当长的时间来学习和设置。

有几种工具可以帮助您强制实施分层体系结构和依赖性限制。这些工具是特定于语言的。 如果您使用的是Java,我建议您使用checkstyle创建自定义检查

安东所指的文字是我写的()。这是基于我们自己的成功经验。自定义检查可以集成到IDE(例如Eclipse),可以集成到您的持续集成工具(例如Jenkins),并且作为防止违规的最后手段,可以作为Subversion的预提交验证自动执行。
自定义检查本身是使用CheckStyleAPI用Java编写的。

JDepend只是分析依赖项。如果依赖项不正确,则不会导致构建失败。目前,我使用IntelliJ DSM功能来分析此类依赖关系。@KonstantinSolomatov同意,但您可以在Sonar中定义规则,以使构建失败。我的帖子中没有包括声纳,因为Kostja已经提到了声纳。在我们的工作中,我们使用构建破坏插件来做同样的事情。几十个小模块怎么了?@yegor256我不想每个包创建一个模块。嗯,这太过分了。在大量的小模块和每个包一个模块之间可能仍然有一个令人满意的中间点。模块应该小到足以进行彻底测试,但大到足以包含逻辑单元。@jordan002是的,应该有。然而,maven模块不允许我强制执行某些类型的约束。例如,某些包不应该从外部模块使用。Structure101是最接近我所需要的工具。不幸的是,它不是开源的。还可以使用Sonar创建架构规则,当与build breaker结合使用时会触发构建失败:@MarkO'Connor这是很棒的东西,thanksA maven插件也可用于ClassCycle