【问题标题】:Java package understanding in real life projects现实生活项目中的Java包理解
【发布时间】:2014-05-17 00:00:23
【问题描述】:

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

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

谢谢, 维平

【问题讨论】:

    标签: java jar packaging software-packaging


    【解决方案1】:

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

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

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

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

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

    Package By Feature Package-by-feature 使用包来反映 功能集。它试图放置与单个相关的所有项目 功能(并且只有该功能)到单个目录/包中。这 导致包具有高内聚性和高模块化,并且具有 包之间的最小耦合。紧密配合的项目 彼此相邻放置。它们并没有散布在整个 应用。有趣的是,在某些情况下, 删除一个特征可以减少到一个单一的操作 - 删除一个 目录。 (删除操作可能被认为是一个很好的测试 最大模块化:一个项目只有当它可以是最大的模块化 在单个操作中删除。)

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

    【讨论】:

    • 我建议至少这样开始,例如:[com].[mydomain].[mymodule].[mysubmodule].[layer].[subcategory] ​​其中 [mymodule] 是应用程序或库 [mysubmodule] 类似于客户端、服务器、android、commons(用于库)。 Layer 类似于 service、ui、web 等。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      从 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/

      Why maven? What are the benefits?

      有关包组织的指导,您只需搜索“java 包”短语即可。 http://www.tutorialspoint.com/java/java_packages.htm

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-02-21
          • 2016-11-23
          • 1970-01-01
          • 2018-07-12
          • 1970-01-01
          • 2011-03-31
          • 2012-08-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多