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

假设我们有一个包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)。

谢谢,
维品

最佳答案

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

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

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

将代码组织到程序包中的工作由不同的人员以不同的方式进行。有些人喜欢按层组织代码(将所有控制器放在一个程序包中,所有服务放在另一个程序包中,所有dao放在另一个程序包中),有些人喜欢按功能组织代码。

逐层打包是组织代码的常规方式,它似乎是Java社区中的首选做法。这样的结果是,当代码将功能实现为与包结构成直角的垂直切片时(因为它可能需要新的控制器端点,也许需要新的服务方法等),因此代码的紧密相关位同一功能最终分散在不同目录中。 The Java Practices website makes an interesting case for package-by-feature


按功能打包按功能打包使用包来反映
功能集。它尝试放置与单个物品相关的所有物品
功能(并且只有该功能)到单个目录/程序包中。这个
产生具有高内聚力和高模块化性的包装
封装之间的耦合最小。紧密配合的物品
并排放置。它们并没有分布在整个
应用。有趣的是,在某些情况下,
删除功能可以简化为单个操作-删除
目录。 (删除操作可能被认为是对
最大模块化:只有能够
在一次操作中删除。)


这是一个SO问题asking about package by feature or layer

07-28 02:14
查看更多