Java:子目录点

Java:子目录点,java,Java,首先:我并不完全熟悉Java,我知道我在玩Java的时候学到了一些东西 然而,在几乎所有的开源Java项目中,我都注意到了一点——对源代码使用了很多子目录,通常看起来是这样的: ./src/main/java/com/somedomainname/projectname/sourcefile.java 现在,为什么有这么多子目录?域名是怎么回事?定义了一个表示包名应该包括域名的名称,因为它提供了一个全局根命名空间 源文件需要位于与包名匹配的子文件夹中,因为Sun Java编译器,javac,强

首先:我并不完全熟悉Java,我知道我在玩Java的时候学到了一些东西

然而,在几乎所有的开源Java项目中,我都注意到了一点——对源代码使用了很多子目录,通常看起来是这样的:

./src/main/java/com/somedomainname/projectname/sourcefile.java
现在,为什么有这么多子目录?域名是怎么回事?

定义了一个表示包名应该包括域名的名称,因为它提供了一个全局根命名空间


源文件需要位于与包名匹配的子文件夹中,因为Sun Java编译器,
javac
,强烈支持它。此外,许多其他构建工具和IDE也强烈鼓励或要求将源.java文件存储在与包匹配的路径中。

域名用于包名,因此该文件将用于类

com.somedomainname.projectname.sourcefile
其中
com.somedomainname.projectname
是包

通常,源文件组织反映包布局。普通的Java编译器实际上并不强制执行目录结构(尽管某些IDE,如Eclipse,如果您将内容放在“错误”的目录中会抱怨),但它确实强制公共类位于具有相同名称的文件中。非公共类可以放在任何文件中,但按照惯例,文件名也与该文件中的类名匹配。它使得在没有任何先验知识的情况下很容易导航到任何类

Java语言规范没有规定编译器必须对公共类强制执行约定;但它明确表示它可以。有关更多详细信息,请参阅

Java包是一种用于 将Java类组织成 与的模块类似的名称空间 模。Java包可以存储在 压缩文件称为JAR文件, 允许类以更快的速度下载 一次一组而不是一个。 程序员通常也使用 用于组织所属类的包 属于同一类别或提供 类似的功能


…从

子目录作为一种组织工具,这样您就不会只有一个目录包含大量java文件。您经常看到域名的原因是,人们通常从自己的域名派生java包名称,以防止与其他开发人员发生冲突。因此,尽管我们可能都有一个util.Stringutil类,但如果我将我的命名为com.mydomain.util.Stringutil,而您的命名为com.yourdomain.util.Stringutil,我们可以拥有一个包含这两个类的项目,而不会产生冲突。

此目录结构用作一种约定,显示库的来源,并将其与其他源分开

使用此结构的一个原因是使用的标准

Maven是一个帮助管理项目依赖关系的构建工具。Maven是为约定优先于配置而设计的,因此您经常会看到这种目录结构,以使其与Maven一起工作

Maven指定java文件的目录结构以/src/main/java开头,其余的基于名称空间的命名约定


在路径中使用域名是为了防止类冲突。如果两个不同的库都提供具有相同名称的类,则域名命名空间允许它们都使用。

这是定义java源代码唯一位置的标准。遵循这个包结构是惯例,这就是为什么到处都可以看到它。不需要这样做-您可以随意命名您的包。然而,遵循这一惯例是很平常的

package prefix.organization.project.ClassName; package prefix.organization.project.package.ClassName; package prefix.organization.project.package.subpackage.ClassName; 包前缀.organization.project.ClassName; 包前缀.organization.project.package.ClassName; 包前缀.organization.project.package.subpackage.ClassName; 存储Java源代码文件时,包名称的每一部分都转换为一个子目录。因此,上面显示的三个类将位于主类路径之外的相应目录中

prefix/organization/project/ClassName.java prefix/organization/project/package/ClassName.java prefix/organization/project/package/subpackage/ClassName.java 前缀/organization/project/ClassName.java 前缀/organization/project/package/ClassName.java 前缀/organization/project/package/subpackage/ClassName.java 手工编译时,确保主类路径目录是当前目录或在类路径中,以便可以找到源代码文件


至于
src/main/java
部分,它似乎来自Maven。我从来没用过那个软件。我不明白为什么他们需要这么多,因为我的项目(我使用Eclipse)只是在那里有一个
src
文件夹

  • src/main/java
    这是需要传递给javac编译器的目录,说明在哪里可以找到用于编译的源代码。
    1.1 src/test/java
    这是单元测试类应该保留的地方。
    1.2 src/main/resources和src/test/resources
    这些是相应的目录,资源(如属性文件)应保存在这些目录中。 1.3单独的输出目录。
    main和*test*类和资源应该编译到各自独立的输出目录中。Maven使用目标/类和目标/测试类。当您将编译好的类文件放入jar中进行分发时,您不希望包含测试类和测试资源文件
  • com/somedomainname/projectname
    此目录结构对应于projectname中的类中的包声明,即
    package com.somedomainname.projectname
  • java对应于它定义的类名,按照惯例,它应该以大写字符开头,请参见
  • 此外,在上面的链接中,您将发现默认包命名约定使用的域名是相反的

  • 在较新的O'Re中,有一篇关于java包和目录的有趣文章