Java (Maven) 中深层文件夹结构的意义何在?

What's the point of a deep folder structure in Java (Maven)?

提问人:Robert S 提问时间:10/20/2021 最后编辑:Robert S 更新时间:11/16/2021 访问量:1432

问:

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

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

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

Java Maven

评论

7赞 JustAnotherDeveloper 10/20/2021
肯定在顶部或附近有一行,上面没有其他不是注释的文本,读作 .在 Java 中,类可以被构造在包中,并且所述包在文件系统中被结构化为一系列嵌套文件夹。RestClient.javapackage java.org.bah.co.lab.zeus.apimanager
1赞 tgdavies 10/20/2021
将包视为有助于将类分类。
3赞 MadProgrammer 10/20/2021
也许是时候开始学习 Java 了,从一堂关于的课程开始
0赞 rzwitserloot 10/20/2021
@JustAnotherDeveloper “java”是 maven 结构的一部分;package 语句以 开头。org.
0赞 JustAnotherDeveloper 10/20/2021
@rzwitserloot 是的,你是对的。我完全是脑屁,现在编辑我的评论为时已晚:(

答:

10赞 rzwitserloot 10/20/2021 #1

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

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

要解释每一层:

src

指示这些是源文件:编译和生成的东西不应该在这里,整个树应该在版本控制中。与例如形成鲜明对比 或包含构建工件,包含文档,谁知道存储库的其他相关部分还需要哪些其他目录。srcbinbuilddoc

main

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

java

有一种叫做拆分语言的项目,其中一些是用语言 A 编写的,有些是用语言 B 编写的。就其价值而言,我认为这一层是糟糕的设计;以 结尾的文件透露了如何“编译它”,这几乎适用于每个需要应用编译器的源文件:扩展名与文件夹名称一样多。为了向您展示一个常见的对比: 许多项目都有: 只需复制资源即可“编译”资源: 假设您的应用有一个文本文件,其中包含美国所有州的列表以及每个州使用的所有邮政编码。或带有 GUI 应用程序的图标图像的文件。这些文件与类文件一样是主应用程序的一部分,并且应该最终位于同一位置(文件内部),但要“编译”它们,您只需......复制它们,你不会跑去做这件事。这就是这个级别的内容:应该使用什么工具将源文件转换为可分发的方面?.javajavasrc/main/resourcessrc/main/javapngjarjavac

co/lab/zeus/apimanager

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

这让我们.project_name/src/main/java

org/bah

你编造的夸张。没有人主持 proj on .但是,如果他们这样做了:请与决定将域名分配给团队的管理层交谈。这是在他们身上,而不是在这个项目的作者身上。zeus.lab.co.bah.org

评论

0赞 Robert S 10/20/2021
哈哈,不夸张!我稍微混淆了文件夹名称,但纯粹的深度计数是诚实的!我真的很感谢你的解释,rzwitserloot!
2赞 Harry Coder 10/20/2021 #2

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 :包含您的测试代码

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

当您使用 IntelliJ IDEA 时,您可以使用“紧凑型中间包”选项显示您的包。