为新手解释Java项目结构?

2022-08-31 17:16:58

我来自.NET背景,对Java完全陌生,并试图了解Java项目结构。

我的典型 .NET 解决方案结构包含表示逻辑上不同的组件的项目,通常使用以下格式命名:

MyCompany.SomeApplication.ProjectName

项目名称通常等于项目的根命名空间。如果它是一个大型项目,我可能会进一步分解命名空间,但通常我认为没有必要进一步使用命名空间。

现在在Java中,你有由项目组成的应用程序,然后你有一个新的逻辑级别 - 包。什么是包?它应该包含什么?如何在此结构中使用命名空间?JAR在哪里适合所有这些?基本上,有人可以提供Java应用程序结构的新手介绍吗?App.Project.Package

谢谢!

编辑:一些真正破解的答案谢谢伙计们。然后有几个后续问题:

  • 做。JAR 文件包含已编译的代码?或者只是压缩的源代码文件?
  • 为什么包名称都是小写的,这有充分的理由吗?
  • 包可以有“循环依赖关系”吗?换句话说,Package.A可以使用Package.B,反之亦然吗?
  • 任何人都可以展示将类声明为包中的典型语法,并声明您希望在类中引用另一个包(也许是 using 语句?)

答案 1

“简单”J2SE 项目

正如cletus所解释的那样,源目录结构直接等同于包结构,这本质上是内置于Java中的。其他一切都不那么明确。

许多简单的项目都是手工组织的,所以人们可以选择一个他们觉得可以接受的结构。经常做的事情(这也反映在Eclipse(一个非常占主导地位的Java工具)中的项目结构上)是让你的源代码树从一个名为.无包源文件将直接位于 src 中,包层次结构(通常以目录开头)同样包含在 中。如果在启动编译器之前访问该目录,则编译后的文件将最终处于相同的目录结构中,每个.class文件位于同一目录中,并且位于其文件旁边。srccomsrcCDsrcjavac.class.java

如果您有很多源文件和类文件,则需要将它们彼此分开以减少混乱。手动和 Eclipse 组织通常将 或 目录与 或 并行放置,以便.class文件最终位于镜像 的层次结构中。binclassessrcsrc

如果项目具有一组要从第三方库提供功能的文件,则第三个目录(通常)与 和 平行放置。中的所有内容都需要放在类路径上进行编译和执行。.jarlibsrcbinlib

最后,有一堆这个和那个或多或少是可选的:

  • 文档中的文档doc
  • 中的资源resources
  • 数据data
  • 配置在 ...conf

你明白了。编译器不关心这些目录,它们只是你自己组织(或混淆)的方式。

J2EE 项目

J2EE大致相当于 ASP.NET,它是一个用于组织Web应用程序的大规模(标准)框架。虽然您可以按照自己喜欢的任何方式为 J2EE 项目开发代码,但对于 Web 容器期望交付应用程序的结构有一个严格的标准。这种结构也倾向于反映到源布局。下面是一个页面,详细介绍了 Java 项目的总体项目结构(它们与我上面写的内容不太一致),特别是 J2EE 项目:

http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

Maven 项目

Maven是一个非常通用的项目构建工具。就个人而言,我的构建需求得到了很好的满足,这与 大致相比。另一方面,Maven是完整的生命周期构建管理,并附加了依赖性管理。Java世界中大多数代码的库和源代码都可以在“net”中免费获得,如果问得好,maven会为你爬行它,并将你的项目需要的一切带回家,甚至不需要你告诉它。它还为您管理一个小存储库。antnmake

这种高度勤劳的小动物的缺点是,它对项目结构的高度法西斯主义。你以Maven的方式做,或者根本不做。通过强制其标准,Maven设法使全球项目在结构上更加相似,更易于管理,并且更容易以最少的输入自动构建。

如果您选择Maven,您可以不再担心项目结构,因为只有一个。就是这样:http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html


答案 2

Java 中的包与 .Net 中的命名空间非常相似。包的名称实质上创建了一个路径,该路径指向位于其中的类。可以将此路径视为类的命名空间(以 .Net 术语表示),因为它是要使用的特定类的唯一标识符。例如,如果您有一个名为:

org.myapp.myProject

在里面,你有一堆类:

MyClass1
MyClass2

要专门引用这些类,您将使用:

org.myapp.myProject.MyClass1
org.myapp.myProject.MyClass2

这与.Net(据我所知)之间唯一真正的区别是Java在结构上组织其“命名空间”(每个包都是一个不同的文件夹),而.Net允许您使用关键字来限定类的范围并忽略文档的实际位置。namespace

在大多数情况下,JAR 文件大致类似于 DLL。它是一个压缩文件(您可以使用 7zip 打开它们),其中包含来自其他项目的源代码,这些项目可以作为依赖项添加到应用程序中。库通常包含在 JAR 中。

关于Java要记住的是,这是非常结构化的。文件所在的位置很重要。当然,这个故事比我发布的内容更多,但我认为这应该让你开始。


推荐