将 Java 源代码包视为一个大的分层名称空间。商业应用程序通常位于 'com.mycompany.myapp'(此应用程序的网站可能是'http://myapp.mycompany.com http://myapp.mycompany.com’尽管显然情况并非总是如此)。
如何组织 myapp 包下的内容很大程度上取决于您。在 C# 中,可执行文件 (.exe)、DLL 和低级类之间的区别在 Java 中并不以相同的形式存在。所有 Java 源代码都编译为 .class 文件(其内容称为“字节码”),可以由许多平台上的 Java 虚拟机 (JVM) 执行。因此,高级/低级类没有固有的区别,除非您通过包装来指定这些级别。一种常见的封装方式是:
-
com.mycompany.myapp:主类; MyApp(带有 main 方法)
-
com.mycompany.myapp.model:领域模型类;客户、订单等
-
com.mycompany.myapp.ui:用户界面(演示或视图)代码
-
com.mycompany.myapp.service:应用程序中的服务,即“业务逻辑”
-
com.mycompany.myapp.util:在多个地方使用的辅助类
这表明这是一个独立的 Java 应用程序,如果它是使用众多框架之一的 Web 应用程序,则可能会有所不同。
这些包对应于项目中的目录层次结构。使用 Eclipse 时,这种层次结构的根称为“源目录”。一个项目可以定义多个源目录,通常是“主”和“测试”源目录。
项目中的文件示例:
src/test/java/com/acme/foo/BarTest.java
src/main/java/com/acme/foo/Bar.java
lib/utilities_1_0.jar
在utilities_1_0.jar里面:
com/acme/foo/BarUtils.class
BarUtils.class 这是一个已编译的 java 类,因此采用与平台无关的字节码形式,可以在任何 JVM 上运行。通常,jar 文件仅包含已编译的类,但有时您可以下载也包含源 (.java) 文件的 jar 版本。如果您希望能够读取正在使用的 jar 文件的原始源代码,这非常有用。
在上面的示例中,Bar、BarTest 和 BarUtils 都位于同一个包 com.acme.foo 中,但物理上驻留在硬盘上的不同位置。
直接驻留在源目录中的类位于“默认包”中,将类保留在那里通常不是一个好主意,因为不清楚该类属于哪个公司和应用程序,并且如果有任何 jar 文件,您可能会遇到名称冲突您添加到类路径中的默认包中包含一个具有相同名称的类。
现在,如果您部署此应用程序,它通常会被编译为 .class 文件并捆绑在 .jar 中(这基本上是 .zip 文件加上一些清单信息的奇特名称)。
运行应用程序不需要制作 .jar,但在部署/分发应用程序时很方便。使用清单信息,您可以使 .jar 文件“可执行”,以便用户可以轻松运行它,请参阅[a]。
通常您还会使用多个库,即从 Internet 获取的现有 .jar 文件。非常常见的示例是 log4j(日志框架)或用于访问数据库的 JDBC 库等。此外,您可能有自己的子模块,部署在单独的 jar 文件中(如上面的“utilities_1_0.jar”)。如何在 jar 文件上分割是一个部署/分发问题,它们仍然共享 Java 源代码的通用命名空间。因此,实际上,如果您愿意,您可以解压缩所有 jar 文件并将内容放入一个大目录结构中(但通常不会)。
当运行使用/由多个库组成的 Java 应用程序时,您会遇到通常所说的“类路径地狱”。正如我们所知,Java 的最大缺点之一。 (注:帮助据说是在途中 http://blogs.oracle.com/theplanetarium/entry/project_jigsaw_modularizing_jdk_7)。要在命令行(即不是从 Eclipse)上运行 Java 应用程序,您必须指定类路径上的每个 .jar 文件位置。当您使用 Java 的众多框架(Maven、Spring、OSGi、Gradle)之一时,通常会有某种形式的支持来减轻这种痛苦。如果您正在构建一个 Web 应用程序,您通常只需遵守其分层/部署约定,以便能够轻松地将其部署到您选择的 Web 容器(Tomcat、Jetty、Glassfish)中。
我希望这能让您对 Java 中的工作原理有一些一般性的了解!
[a] 要制作 MyApp 应用程序的可执行 jar,您的路径上需要有 JDK。然后在编译(bin 或目标)目录中使用以下命令行:
jar cvfe myapp.jar com.mycompany.myapp.MyApp com\mycompany\myapp
然后您可以使用以下命令从命令行执行它:
java -jar myapp.jar
或者双击 jar 文件。请注意,在这种情况下您将看不到 Java 控制台,因此这仅对具有自己的 GUI(如 Swing 应用程序)或可能在后台运行(如套接字服务器)的应用程序有用。