Java中的架构约束

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

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

PS我知道我可以在单独的maven模块中分离项目。 不幸的是,我的真实案例比3层系统更复杂。 如果我使用maven模块,我会有几十个非常小的模块。

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

虽然我不确定是否可以在层依赖性违规上强制执行构建失败,但至少有一个工具可以检查和可视化这些层: Sonar 。 您可以将它与maven和jenkins构建以及eclipse(以及其他IDE)集成。

Sonar具有依赖矩阵视图 ,可视化包的相互依赖性。

编辑:似乎可以配置声纳来强制构建失败由违规触发: 构建断路器插件

这是一个非常有效的问题,因为许多项目通过Maven模块强制执行依赖性,这极大地浪费了生产力和灵活性。

在花了很多时间研究这个主题后,我可以推荐两个工具:

这两种工具去年都没有发展很多,但效果很好。 Macker具有基于XML的语法,但Classycle具有整洁的DSL。 Classycle是更高级的专业工具,具有层次概念。 这些工具允许您在包和某些类类型之间强制执行严格的障碍。 应该在构建过程中配置此工具以立即在任何约束时失败。

检查此处的分层示例( http://innig.net/macker/example/layering/src/macker.xml )和此处( http://classycle.sourceforge.net/ddf.html#layer )。

对于一个好的开源工具来说还有一个利基,它会挂钩到编译器中,并且当你在IDE而不是构建工具时会给你错误。 Structure101function更丰富,但也很重,依赖于Eclipse插件。

更新

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

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

Architexa是另一种可能有用的工具。

您可以使用Checkstyle实现“自定义检查”。 了解更多信息: http : //saturnnetwork.wordpress.com/2012/11/26/ultimate-architecture-enforcement-prevent-code-violations-at-code-commit-time/

我自己没有尝试,但我认为实施起来并不困难,而且它是免费的。

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

我撰写了Anton提到的文章( Ultimate Architecture Enforcement )。 这是基于我们自己的成功经验。 自定义检查可以集成到IDE(例如,Eclipse),可以集成到您的持续集成工具(例如,Jenkins),并且作为防止违规的最后手段可以作为Subversion的预提交validation自动执行。 自定义检查本身使用checkstyle API以Java编写。