在 Java 中创建包

Creating a Package in Java

这里有人可以帮我打包吗?我已经了解包的工作原理。

如何导入它们以及如何使用 package 关键字制作它们。目录和工作方式。什么是 classpath 以及如何设置它。

但是我无法得到的一件事是如果我想创建一个包并在 class 路径中添加基本目录的位置,那么该基本目录中应该有什么??

它是 .java 文件还是 .class 文件,或者两者都有,还是名为 .jar 的文件?

我也不知道jar格式是什么

包是 class 个名称的唯一名称space。它可以防止程序之间和库之间的冲突。

例如,如果您制作了一个名为 Spreadsheet 的 class,而其他几个人也制作了一个名为 Spreadsheet 的 class,并且出于某种原因所有这些 classes 在 运行 时可用,只能加载一个。 (实际上比这更复杂,但我的说法对于大多数常见情况都是正确的。)

但是如果您的 class 被命名为 com.kataria.Spreadsheet,它不太可能与任何其他 class 冲突,因为它们不太可能具有该包名称。

包名称是 class 名称的一部分。 Java 没有名为 List 的 class,但是 Java 确实有一个名为 java.util.List 的 class。 import 语句只是编译器 shorthand; import java.util.List; 告诉编译器,“每次我写 List,我实际上是指 java.util.List。”

由于 class 名称的最后一部分(称为简单名称)只有一个 shorthand,所以两个 classes java.util.Listjava.awt.List 是不同的 classes。它们之间没有冲突。 (但是,如果由于某种原因你想导入两者,那将是一个问题,因为编译器不知道代码中的 List 本身是否应该是 shorthand for java.util.List 或 java.awt.List.)

为了加强一致性,Java 要求每个(public,顶级)class 都在一个与其名称和包完全匹配的文件中:

  • java.util.List 必须在名为 java/util/List.java
  • 的文件中定义
  • com.kataria.Spreadsheet 必须在名为 com/kataria/Spreadsheet.java
  • 的文件中定义
  • com.example.ai.wopr.Brain 必须在名为 com/example/ai/wopr/Brain.java
  • 的文件中定义
  • 等等

同样,.class 文件必须具有相同的命名和目录结构:

  • java.util.List class 必须编译成名为 java/util/List 的文件。class
  • com.kataria.Spreadsheet class 必须编译成名为 com/kataria/Spreadsheet 的文件。class
  • com.example.ai.wopr.Brain class 必须编译成名为 com/example/ai/wopr/Brain 的文件。class
  • 等等

搜索路径是一个非常古老的操作系统概念,远比Java古老。所有 Windows 和 Unix 系统都使用它在命令行上定位程序,以及定位可加载的软件库。

搜索路径是目录的有序列表。当您输入命令时,终端环境 (shell) 在搜索路径中的每个目录中查找该命令。

类似地,Java class路径最初是一个目录列表。如果您输入命令 java com.kataria.Spreadsheet,它将在 class 路径中指定的每个目录中查找 com/kataria/Spreadsheet.class 文件。

不久之后,Java class路径条目被允许为 .zip 文件或 .jar 文件。尽管它们是单个存档文件而不是目录,但此类存档中的条目必须遵守相同的规则:回到前面的示例,class 路径中的第一个 .jar 文件具有 com/kataria/Spreadsheet.class 条目将是 class 在 运行 时加载的来源。

.jar 文件实际上是一个 zip 文件,它具有不同的扩展名和一些特殊的 Java-特定条目。与复制一堆文件相比,交付 Java 程序或库是一种更简单的方法。 (它也是压缩的,所以它使用更少 space 并且可以更快地从磁盘加载。)

当你想要运行一个Java程序时,你通常在命令行上设置class路径:

java -cp /home/kataria/my-spreadsheet.jar:/opt/javafx/lib/javafx.base.jar com.kataria.Spreadsheet

你也可以设置一个名为CLASSPATH的环境变量;这是基于这样一个事实,即原始系统搜索路径已经使用(并将继续使用)环境变量,如“PATH”和“LD_LIBRARY_PATH”。我不建议设置 CLASSPATH,因为它会导致您的程序仅在一个特定环境中 运行ning。该程序不会 运行 在任何其他计算机上,除非该用户还记得设置他们的 CLASSPATH 变量。