提问人:Robert S 提问时间:10/20/2021 最后编辑:Robert S 更新时间:11/16/2021 访问量:1432
Java (Maven) 中深层文件夹结构的意义何在?
What's the point of a deep folder structure in Java (Maven)?
问:
我在工作中继承了一个 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
答:
Maven 是一种工具,它对事情应该走向何方有一定的意见;默认配置。您不必遵循它,但不遵循此默认配置有三个显着的缺点:
- 然后,您必须配置 maven 以告诉它您所做的替代选择。Maven 并没有让这一切变得简单。
- 其他 java 程序员通常采用默认值。如果你有充分的理由偏离,那就去做吧,但“我不喜欢它”不是一个好理由,因为它会毫无意义地增加学习曲线。
- maven 开发人员选择此结构作为默认结构是有原因的。如果你认为这是一个愚蠢的理由,那当然是可能的,你甚至可能是对的,但是你正在使用一个由人编写的构建工具,根据你的说法,这些人(从书的封面来判断这本书)对理智的默认值做出了愚蠢的选择。那不是一个好地方。
要解释每一层:
src
指示这些是源文件:编译和生成的东西不应该在这里,整个树应该在版本控制中。与例如形成鲜明对比 或包含构建工件,包含文档,谁知道存储库的其他相关部分还需要哪些其他目录。src
bin
build
doc
main
一个项目可以由多个可单独建造的人工制品和“种类”的产品组成。例如,大多数项目都包含一堆仅用于测试目的的代码(单元测试)。他们住在.核心产品存在于 .
例如,您还可以为安装程序()或构建插件或注释处理器提供单独的源代码,该处理器需要首先构建,然后在编译项目时需要在类路径上,等等。src/test
main
src/installer
main
java
有一种叫做拆分语言的项目,其中一些是用语言 A 编写的,有些是用语言 B 编写的。就其价值而言,我认为这一层是糟糕的设计;以 结尾的文件透露了如何“编译它”,这几乎适用于每个需要应用编译器的源文件:扩展名与文件夹名称一样多。为了向您展示一个常见的对比: 许多项目都有: 只需复制资源即可“编译”资源: 假设您的应用有一个文本文件,其中包含美国所有州的列表以及每个州使用的所有邮政编码。或带有 GUI 应用程序的图标图像的文件。这些文件与类文件一样是主应用程序的一部分,并且应该最终位于同一位置(文件内部),但要“编译”它们,您只需......复制它们,你不会跑去做这件事。这就是这个级别的内容:应该使用什么工具将源文件转换为可分发的方面?.java
java
src/main/resources
src/main/java
png
jar
javac
co/lab/zeus/apimanager
这与 java 包结构匹配。这实际上是一项单独应用的要求。之所以使用这种深度嵌套的包结构,原因很简单,因为包充当命名空间:如果存在冲突的完全限定名称,那么一切都会崩溃:Java 根本无法处理这个问题。因此,Java 程序员通过使用“反向域名”结构来确保此类冲突永远不会发生:如果您拥有该域,您将将您的项目放在该包中,从而确保除了团队中共享该服务器控制权的其他人之外,没有人可能发生冲突(对于那些:他们在您的团队中,请与他们交谈以避免冲突)。例如,有 3 个不同的开源 java 项目都称为 spark。如果它们都与(因此,作为示例文件),那么对于每个 java 项目,您都会选择 3 个中的一个:另外 2 个您永远不能在此项目中使用。苛刻,毫无意义,这就是为什么(几乎)所有 java 库都使用反向域名作为根包名称,然后 maven 在其目录结构中遵循这个包名称,因为如果你不这样做,生活就会变得非常困难。javac
zeus.lab.co
package spark;
src/main/java/spark/Main.java
javac
这让我们.project_name/src/main/java
org/bah
你编造的夸张。没有人主持 proj on .但是,如果他们这样做了:请与决定将域名分配给团队的管理层交谈。这是在他们身上,而不是在这个项目的作者身上。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
:包含您的测试代码
在您的情况下,项目的结构是由包名称决定的。在这里,名称是,在 Java 中,包实际上是一组嵌套的文件夹。有一个包命名约定,但在大多数情况下,由你来选择要使用的名称。org.bah.co.lab.zeus.apimanager
当您使用 IntelliJ IDEA 时,您可以使用“紧凑型中间包”选项显示您的包。
评论
RestClient.java
package java.org.bah.co.lab.zeus.apimanager
org.