2

我想了解实际大型项目中的打包方法。

假设我们有一个包 com.abc.xyz,为此,我们确实有一个类似 com/abc/xyz 的路径。

是否可以在不同的目录结构中有多个相同的包名称,例如:

目录路径1:/home/user1/project/module1/src/java/com/abc/xyz

目录路径2:

/home/user1/project/module2/src/java/com/abc/xyz

最后,当我们为整个项目创建 jar 时,我们是否针对 com 目录创建 jar?

当某些应用程序使用 import com.abc.xyz 时,它如何知道它指的是哪个目录路径的包?

最后,是否有任何好的书籍/资源提供有关打包的指南,如何将项目划分为模块,包名称等。

还有一件事,一个项目是否有像上述情况一样的通用包基本名称:com.abc.xyz(例如,org.apache.hadoop)。

谢谢,维平

4

4 回答 4

4

就类加载器而言,在不同源目录中创建的包是同一个包。类文件是在同一个 jar 还是不同的 jar 中也没关系。JVM 不会根据源代码的来源进行区分。(当然,如果您有两个由不同的类加载器加载的 jar,那么它们将被区别对待。)

经常使用相同包的不同源代码树的一种情况是,当您在不同目录中进行测试时(使用通常的 Maven 约定,其中代码位于 src/main/java 下,测试位于 src/test/java 中)但是使用与他们使用的代码相同的包。这些测试能够执行被测代码的受保护和包私有部分,因为它们与该代码在同一个包中。

jar 内的目录路径应该从包的根目录开始。(最顶层的目录应该是 /,然后是一个叫做 com 或 org 的目录,等等。)包确实形成了一个树状结构,当你把你的代码放在一个文件系统中时,你最终会得到一个包的层次结构,但是语言它本身不承认“子包”的概念(除了以 java 开头的包是特殊的并得到类加载器的特殊处理)。

将代码组织到包中由不同的人以不同的方式完成。有些人喜欢按层组织代码(将所有控制器放在一个包中,所有服务放在另一个包中,所有 daos 放在另一个包中),有些人喜欢按功能组织代码。

逐层包是组织代码的常规方式,它似乎是 Java 社区的首选做法。这样做的一个后果是,当代码将功能实现为与包结构成直角的垂直切片时(因为它可能需要新的控制器端点,可能需要新的服务方法等),因此密切相关的代码位相同的功能最终分散在不同的目录中。Java 实践网站为 package-by-feature 提供了一个有趣的案例

按功能打包 按功能打包使用包来反映功能集。它尝试将与单个功能(并且仅该功能)相关的所有项目放入单个目录/包中。这导致包具有高内聚性和高度模块化,并且包之间的耦合最小。紧密结合的项目彼此相邻放置。它们并没有分布在整个应用程序中。值得注意的是,在某些情况下,删除功能可以简化为单个操作 - 删除目录。(删除操作可能被认为是对最大模块化的一个很好的测试:一个项目只有当它可以在单个操作中被删除时才具有最大的模块化。)

这是一个关于按功能或层包装的问题。

于 2014-04-04T15:26:02.590 回答
2

是的,您可以在不同的目录中制作重复的包,但我想不出这样做的充分理由。如果包中的类具有相同的名称,您肯定会遇到命名空间冲突。我不确定“模块”在这种情况下是什么意思,但我建议

  • com.abc.module1.xyz
  • com.abc.module2.xyz

反而。这些将是类加载器的不同包。您仍然可以将 /home/user1/project/module1/ 目录结构保持在前面,这没关系。

于 2014-04-04T15:34:10.023 回答
1

从 2 个模块中,您将有两个单独的 jar 文件:module1.jarmodule2.jar. 两者都将在应用程序启动时加载到 ClassLoader 中。

当某些应用程序使用 import com.abc.xyz 时,它如何知道它指的是哪个目录路径的包?

类加载器将处理这个问题。http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html

如果您尝试开发多模块应用程序,我建议您检查Maven工具:

http://maven.apache.org/ ‎</p>

为什么是行家?有什么好处?

有关包组织的指导,您只需 google 'java packages' 短语即可。 http://www.tutorialspoint.com/java/java_packages.htm

于 2014-04-04T15:27:12.007 回答
1

https://www.facebook.com/Niranthara-Jaya-JavaSocial-Media-Apps-Software-Project-Management-244119296136021/

此页面适用于希望了解如何使用真实 Java 项目的人。向此页面发送消息并查看文章。

于 2018-06-10T04:45:31.593 回答