为啥要在包上使用许多子项目和依赖项?

Posted

技术标签:

【中文标题】为啥要在包上使用许多子项目和依赖项?【英文标题】:Why use many sub-projects and dependencies over packages?为什么要在包上使用许多子项目和依赖项? 【发布时间】:2011-11-20 22:34:33 【问题描述】:

在我的职业生涯中,我主要从事中小型 Java 项目。我最近在 Eclipse 中看到了一个由 30 个项目组成的巨大项目。我并没有真正了解创建许多小项目然后维护项目间依赖关系的概念。什么时候我们更喜欢这样而不是简单地在包中组织东西?

我猜这是一个 maven 的东西(主要是使用 Ant)。我也一直在阅读 Maven 的模块概念——我在网上看到一些链接,建议在父模块下为 web、dao 和服务层创建不同的模块。这真的是一种常见/最佳做法吗?

无论有没有 maven——这样的划分真的让生活更轻松吗?将所有东西都放在一个项目中,并为不同的层定义明确的包结构不是更紧凑吗?

【问题讨论】:

实际上它可以用大多数构建系统来完成,所以这不是一个真正的原因。但是如果你这样做了,那么你会发现一些构建系统比其他系统做得更好。 【参考方案1】:

将项目拆分为 API、实现、Web 等组件是很常见的——在需要时这样做。大型项目就是这样:大型。

将组件分开是有好处的”

重用功能(例如,Web 层使用服务层 打包单个组件(例如,将 API 发送给客户端) 版本子组件;定义它们的版本依赖关系

你可以用一个巨大的项目做所有同样的事情,但更难确定什么去哪里,为什么去。当这些分界线明确时,生活会更轻松。

如何容易取决于项目,但是当您处理数十万行代码时,有时会处理数百万行代码,将这些东西分解可以节省巨大的麻烦.

【讨论】:

+1:模块有助于防止对某些 Web 库的依赖蔓延到基础层。只有当它出错时,你才会注意到这一点,突然间,要修复它会是一个巨大的痛苦。【参考方案2】:

为什么选择在 maven 中创建一个单独的模块?为您的发展助一臂之力。真的没有别的原因了。

您可能希望创建一个单独的模块有多种不同的原因:

    关注点分离:是的,您可以使用包来执行此操作,但如果它位于单独的模块中,则可以单独编译,您可以减少包中的 tangle[*] 数量。 这些模块由不同的团队管理,有自己的发布周期。 更易理解的代码:如果您的所有 dao 代码都在一个模块中,而您的所有 Web 代码都在另一个模块中,您可以分别测试它们。 模块可以是单独的可部署实体。我有一个项目,它有两个 Web 应用程序、5 个批次和两个其他核心模块(一个核心用于 webapp,一个核心用于批次)。我现在可以分别构建和部署每个模块。 模块在外部发布和使用。如果这是真的,那么您希望此模块中的“其他”代码数量最少。

您选择拆分为模块的原因与拆分为包的原因相同,但在更高级别,在一组包中。

30 确实有点过分。但可能有充分的理由。由您和您的项目决定模块数量的正确级别。

就个人而言,我尽量不要过度分裂,除非有很好的理由这样做。

[*] Tangle:描述包之间链接的混乱。包A用B,用C,又用A和B。有点不利于理解。

【讨论】:

+1 表示“可以单独编译”。 #2 和 #3 也适用于包。【参考方案3】:

我认为过度模块化类似于过度工程化。在我看来,最好的方法是从一个模块/项目开始,并一直坚持下去,直到每个参与的人都明白,这个现有模块的一部分将受益于被提取到自己的模块中。是的,这意味着在那一点上需要额外的工作,但对我来说,我宁愿做这项工作,也不愿无休止地与不必要的复杂性作斗争,就我的构建和开发环境而言,以获得从未真正实现的好处。

不幸的是,在项目开始时似乎倾向于在编写一行代码之前就模块化到第 n 级。

【讨论】:

不过,大多数“企业”项目一开始都有非常明确的模块分离。【参考方案4】:

这还有另一个好处。如果我必须在“选定”组件上进行部署,我不会浪费时间和资源来部署我不需要的依赖项。

【讨论】:

以上是关于为啥要在包上使用许多子项目和依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要“mvn install”战争项目?

为啥使用 jasmine 对 Node typescript 项目进行 Karma 单元测试会显示包含依赖项的覆盖范围?

为啥在没有依赖项发生更改时,nmake 会执行链接目标?

Webpack 在 bundle 中包含自己的依赖项

swift包管理器中的“警告:没有要在包中构建的目标”错误

在 Spring Boot 中的多个包上使用 @ComponentScan 时出错