【问题标题】:Architectural Constraints In Java [closed]Java中的架构约束[关闭]
【发布时间】:2012-11-07 17:17:39
【问题描述】:

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

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

附:我知道我可以将项目分隔在单独的 Maven 模块中。不幸的是,我的真实案例比三层系统更复杂。如果我使用 maven 模块,我会有几十个相当小的模块。

【问题讨论】:

  • 几十个小模块有什么问题?
  • @yegor256 我不想为每个包创建一个模块。恕我直言,这是矫枉过正。
  • 在大量的小模块和每个包一个模块之间可能仍然是一个快乐的媒介。模块应该小到足以进行彻底测试,但又要大到足以包含一个逻辑单元。
  • @jordan002 是的,应该有。但是,maven 模块不允许我强制执行某些类型的约束。例如,某些包不应该从外部模块中使用。

标签: java maven architecture


【解决方案1】:

JDepend 可以分析您的代码库并为您提供您正在寻找的指标。您正在寻找的三个主要指标是Afferent CouplingsEfferent CouplingsPackage Dependency Cycles

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

【讨论】:

  • JDepend 只是分析依赖关系。如果依赖项不正确,它不会导致构建失败。目前,我使用 IntelliJ DSM 功能来分析此类依赖关系。
  • @KonstantinSolomatov 同意,​​但您可以在 Sonar 中定义规则以使构建失败。我的帖子中没有包含 Sonar,因为 Kostja 已经提到过。我们在工作中使用构建断路器插件来做同样的事情。
【解决方案2】:

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

Sonar 具有 dependency matrix view,它可以可视化包的相互依赖关系。

编辑:似乎可以配置声纳以强制构建因违规触发而失败:build breaker plugin

【讨论】:

【解决方案3】:

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

【讨论】:

  • Structure101 是最接近我想要的工具。不幸的是,它不是开源的。
【解决方案4】:

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

我自己没有尝试过,但我觉得实现起来并不难,而且是免费的。

【讨论】:

    【解决方案5】:

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

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

    这两种工具在过去几年都没有太大的发展,但运行良好。 Macker 具有基于 XML 的语法,但 Classycle 具有简洁的 DSL。 Classycle 是更高级的专用工具,具有层的概念。这些工具允许您在包和某些类类型之间实施严格的障碍。此工具应在构建过程中配置为在任何约束下立即失败。

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

    对于一个好的开源工具来说,仍然有一个利基市场,它可以连接到编译器,并且当你在 IDE 中而不是在构建工具中时会给你错误。 Structure101 功能更丰富,但也很重,并且依赖于 Eclipse 插件。

    更新

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

    【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多