如何组织更大的Java项目-项目与名称空间?

如何组织更大的Java项目-项目与名称空间?,java,Java,我想知道是否有一些关于如何组织更大的Java项目的推荐阅读、最佳实践或意见 我观察到,有些人将所有东西分解成项目(即模块),并创建许多共享依赖网络的项目。这样做的好处是编译通常非常快,但是当项目变得很大时,没有人知道什么取决于什么以及为什么。不要谈论依赖库、版本冲突和合作 另一种选择是只有几个项目,如前端、后端等。名称空间完成了这项工作 任何意见,如果你把一个大项目分成更小的项目,你就会遇到很多依赖性跟踪,你通常不需要考虑。您可以自己管理,也可以使用已经处理了许多核心问题的软件 。它与Apach

我想知道是否有一些关于如何组织更大的Java项目的推荐阅读、最佳实践或意见

我观察到,有些人将所有东西分解成项目(即模块),并创建许多共享依赖网络的项目。这样做的好处是编译通常非常快,但是当项目变得很大时,没有人知道什么取决于什么以及为什么。不要谈论依赖库、版本冲突和合作

另一种选择是只有几个项目,如前端、后端等。名称空间完成了这项工作


<>任何意见,如果你把一个大项目分成更小的项目,你就会遇到很多依赖性跟踪,你通常不需要考虑。您可以自己管理,也可以使用已经处理了许多核心问题的软件

。它与Apache的Ant很好地集成,并且有一个单独的配置文件(可以签入)来跟踪每种构建所需的内容

Apache的Maven是另一个不错的选择;然而,它比Apache的常春藤做得更多。有时“更多”意味着你做的事情比你本来要做的要少,有时“更多”意味着你正在做(和配置)你以前没有做过的事情。根据您的实践是否适合Maven,迁移到Maven可能很容易,也可能很难

此外,使用Ivy,您可以建立自己的“允许的”jar文件的私有存储库,以便从中提取,这将使代码审计更加容易。基本上,将ivy重新配置为不从web上提取,而是仅从本地存储库中提取,然后控制对存储库的访问,以仅允许已审核的具有可接受许可的jar文件

一旦你有了合适的软件,你就可以把项目分成更小的部分。这将允许您做正确的事情(如果您的项目倾向于小分解),而不是权宜之计(几个大的块,这可能不会真正为您购买多少分解可维护性)。至于在哪里进行削减,这在很大程度上取决于应用程序的具体情况

许多小东西往往更容易让新人一个接一个地消化。他们还让人们思考将功能添加到项目中的位置;然而,理清和分离所有组件确实需要花费时间和精力。有利的一面是,通常更容易测试和验证较小的内容,不利的一面是,将一个单一的职责集合分解为许多小型、集成良好但功能不同的单元需要更长的时间


祝你好运

一个非常大的项目需要有某种方法来跟踪它使用的所有库和其他依赖项。这样做的实际标准是Maven。这绝对是开始跟踪应用程序的最佳方式


然后您可以决定如何拆分应用程序。基本上,这里要做的是将应用程序拆分为完整的功能部分。例如,如果你有一个网站,它有一个联系人表单、一个照片库、一个购物车和一个论坛,你会把项目分成几个部分,每个部分都包含这些不同的模块

实际上,您需要同时利用项目和名称空间

名称空间是区分代码在代码级别的用途的重要工具。不管一个类来自哪个项目,这个包都应该让我了解它的用途

在更高的层次上,通过将代码分离到项目中,更容易管理构建和开发环境。例如,如果您正在开发UI,为什么需要将数据库代码加载到IDE中?这只是你工作空间中的额外混乱。它还简化了在不同项目之间共享公共功能的过程。这当然会导致需要某种形式的依赖关系管理,其中提到的工具(如Maven或Ivy)就足够了


不过这是一个重要的提示。不要在项目之间使用拆分包。如果您或任何将要使用您的代码的人想要在OSGi环境中这样做,这会导致噩梦。因此,您的名称空间在项目中应该是唯一的,尽管它们应该与其他相关项目共享一个公共根。

我们使用Maven来管理依赖项和单独的项目。将源代码划分为可操作的块,并确保我们没有库地狱。Maven在项目管理方面非常出色,但他有一个现有的项目,将他的项目放入Maven的成本可能有点高。如果他能做到,那太好了!如果他只是想要依赖项跟踪(不需要重新设计构建/部署以适应Maven模型的成本),Apache的Ivy就更有意义了。非常正确。然而,我没有得到他的印象,他问的是一个现有的项目,而是总体的最佳实践。如果你是从零开始的,那么我会说Maven。Maven是一个比常春藤更完整的解决方案,所以我会选择Maven而不是常春藤。来自Apache网站:“首先,最重要的区别是它们根本不是同一种工具。Apache Maven是一种软件项目管理和理解工具,而Apache Ivy只是一种依赖关系管理工具,与Apache Ant高度集成™, 流行的构建管理工具。因此,也许有一个更有趣的比较可以比较ApacheAnt+Ivy和ApacheMaven。但这超出了本页的范围,本页只关注依赖关系管理。”