Java (Maven) 中的深层文件夹结构有什么意义?



我在工作中继承了一个Java(Maven)项目。我不是Java开发人员,但这个项目现在是我的了。当我克隆(lagit clone)存储库时,我注意到文件夹结构在任何.java文件出现之前都非常深入。例如,文件夹结构如下:

project_name
.git
.idea
src/
main/
java/
org/
bah/
co/
lab/
zeus/
apimanager/
RestClient.java

我在谷歌上搜索了一下,试图找出为什么文件夹结构如此之深。在对Maven进行了一些研究后,我的理解是默认结构以/src/main/java开头。所以,我很好奇为什么以前的(现在是不可通信的)开发人员会这样构建这个回购(以及许多其他的)。为了不征求意见,请告诉我:这个项目的结构是这样的,有技术原因吗?在apimanager文件夹之外,实际上没有其他.java文件,那么有什么技术原因可以把所有东西都埋得这么深呢?

Maven是一个对事情应该走向何方有一定意见的工具;默认配置。您不必遵循它,但不遵循此默认配置有三个显著的缺点:

  • 然后您必须配置maven来告诉它您所做的替代选择。Maven并没有让这件事变得容易
  • 其他java程序员通常采用默认值。如果你有充分的理由偏离,那就去做,但"我不喜欢"不是一个好理由,因为这会毫无意义地增加学习曲线
  • maven开发人员选择这个结构作为默认结构是有原因的。如果你认为这是一个愚蠢的原因,那当然是可能的,你甚至可能是对的,但你使用的是一个由人们编写的构建工具,根据你的说法,这些人(从封面来判断这本书)对合理的默认值做出了愚蠢的选择。那不是一个好地方

解释每一层:

src

指示这些是源文件:编译和生成的内容不应在此处,整个src树应处于版本控制中。例如,与包含构建工件的binbuild、包含文档的doc以及谁知道回购的其他相关部分还需要哪些其他目录形成对比。

main

一个项目可以由多个可单独建造的人工制品和"种类"的产品组成。例如,大多数项目都包含一组仅用于测试目的(单元测试)的代码。他们住在src/test。核心产品生活在main中。例如,您还可以为安装程序(src/installer)、构建插件或注释处理器提供单独的源,这些源需要首先构建,然后在编译main项目时需要位于类路径上,等等。

java

有一种东西是分裂语言项目,其中一些是用a语言编写的,另一些是用B语言编写的。就其价值而言,我认为这一层是糟糕的设计;以.java结尾的文件透露了如何"编译它",这适用于几乎所有需要应用编译器的源文件:扩展名的含义与java的文件夹名称一样多。向您展示一个常见的对比:许多项目都有src/main/resourcessrc/main/java:资源只需复制即可"编译":想象一下,您的应用程序有一个文本文件,其中包含所有美国州的列表,每个州都使用了所有邮政编码。或者带有GUI应用程序图标图像的png文件。这样的文件和类文件一样是主应用程序的一部分,并且应该在同一个位置(在jar文件中)结束,但要"编译"它们,只需。。复制他们,你不会运行javac来做这件事。这就是这个级别的内容:应该使用什么工具将源文件转换为可分发的方面?

co/lab/zeus/apimanager

这与java包结构相匹配。这实际上是javac本身应用的要求。使用这种深度嵌套的包结构的原因很简单,因为包充当命名空间:如果存在冲突的完全限定名称,所有的地狱都会崩溃:Java根本无法处理这一问题。因此,java程序员通过使用"反向域名"结构来确保此类冲突永远不会发生:如果你拥有zeus.lab.co域,你会把你的项目放在那个包里,从而确保除了团队中共享服务器控制权的其他人之外,没有人可能会发生冲突(对于这些人:他们在你的团队中,与他们交谈以避免冲突)。例如,有3个不同的开源java项目,它们都被称为spark。如果它们都使用了package spark;(因此,src/main/java/spark/Main.java作为一个示例文件),那么对于每个java项目,您都会从3个中选择一个:其他2个,您永远不能在该项目中使用。粗糙且毫无意义,这就是为什么(几乎)所有java库都使用反向域名作为根包名称,然后maven在其目录结构中遵循这个包名称,因为如果不这样做,javac会让生活变得极其困难。

这让我们进入project_name/src/main/java

org/bah

你把那说得太夸张了。没有人在zeus.lab.co.bah.org上主持项目。但如果他们这样做了:与决定将域名分配给团队的管理层谈谈。这取决于他们,而不是这个项目的作者。

Maven是一个构建和依赖关系管理工具,可帮助开发应用程序并通过命令行管理开发过程的所有生命周期,如构建编译打包测试等。关于Maven项目的结构,有一个惯例:

└───maven-project
├───pom.xml
├───README.txt
├───NOTICE.txt
├───LICENSE.txt
└───src
├───main
│   ├───java
│   ├───resources
│   ├───filters
│   └───webapp
├───test
│   ├───java
│   ├───resources
│   └───filters
├───it
├───site
└───assembly 

目前需要了解的重要内容是每个文件和文件夹的角色以及如何使用Maven命令。

pom.xml:此文件包含项目的结构和信息,以及依赖项(外部jar)。此文件由您在Maven 中执行的命令使用

src/main/java:包含您的包和源代码。

src/test/java:包含您的测试代码

在您的情况下,项目的结构取决于包名称。这里,名称是org.bah.co.lab.zeus.apimanager,在Java中,包在物理上是一组嵌套的文件夹。有一个包命名约定,但在大多数情况下,由您选择要使用的名称。

当您使用IntelliJ IDEA时,您可以使用选项Compact Middle Packages来显示您的程序包。