1

我从来没有真正理解过 java 库,如果有人能澄清我的理解,我会很高兴:

  1. 当我需要一个包时,Java 默认不提供该包,然后我用谷歌搜索它并下载二进制文件。即“HttpClient”然后我httpcomponents-client-4.2.2-bin.zip从 apache.org下载
  2. 我首先需要将 .zip 文件导入 netbeans,然后使用import命令(通常会自动建议)。

我还有一些疑问/问题。

HttpClient 类似乎是 apache 客户端库的一部分,但有人告诉我import sun.net.www.http.HttpClient为什么?(即使我这样做也不能解决其他问题)

然后尝试使用HttpClient httpclient = new DefaultHttpClient();说找不到 DefaultHttpClient 符号,但该库已添加到 Netbeans。

看看这个类似的例子http://www.vogella.com/articles/ApacheHttpClient/article.html我下载的包中没有一些导入。

这在我身上经常发生,有时我在没有真正理解的情况下设法修复它。Atm 我正在尝试实现这个答案https://stackoverflow.com/a/3325065/960086

4

1 回答 1

4

好的,关于 JVM 如何创建类的实例,您需要了解一些事情,我将从底部开始。

当 JVM 启动时,它需要加载将用于运行应用程序的类。为此,需要使用 3 个类加载器——引导类加载器、扩展类加载器和系统类加载器。前 2 个分别从 $JAVA_HOME/lib 和 $JAVA_HOME/lib/ext 中的 jar 文件加载类。它们基本上是让 JVM 运行所需要的——暂时不要担心这些。第三个类加载器,系统类加载器,是您感兴趣的。正是这个系统类加载器使用类路径来查找要添加到 JVM 以形成应用程序的类。

类加载器还有更多功能,但现在就可以了。

所以系统类加载器使用类路径来加载类。在其最简单的形式中,类路径只不过是对 Java 编译器将其创建的类输出到的目录的引用。在该目录中,您将找到一个目录层次结构,这些目录代表您在编写类时使用的包结构(.java 文件顶部的包声明,用于在应用程序上下文中组织您的类)和 .class 文件包含已编译的类。当 JVM 需要一个类时,系统类加载器会解析代表包的目录结构并加载该类(如果找不到则抛出 ClassNotFoundException)。

现在,Java 的优势之一是可用的 3rd 方库的绝对数量。显然,通过复制目录来共享代码是行不通的,因此使用了Java ArchiveJAR文件。JAR只不过是一个 zip 文件,其中包含几个标准目录以及代表包结构的相同目录和我之前提到的 .class 文件。当然它会选择扩展名 .jar 但任何能够打开 zip 文件的工具都会打开一个JAR。要使用JAR,您只需像添加目录一样将其添加到类路径中,并且与目录一样,系统类加载器将解析它包含的结构以根据需要加载类。

也就是说,当您决定使用 3rd 方库时,您很少只下载一个JAR ,就像您使用 HttpClient 的情况一样。显然,任何 3rd 方库都不仅仅是类,大多数将包括文档、示例甚至源代码。但是,要使用 3rd 方库,过程是相同的,您需要提取包含您要使用的类的JAR并将该JAR添加到您的classpath中。

这几乎是完整的故事——随着典型应用程序使用的 3rd 方库数量的增加,管理这些库的问题也随之增加,因此带有 Ivy 的 Ant 和最近的 Maven 变得流行起来。除了它们的构建功能之外,它们都提供了一种声明应用程序所依赖的第三方库的方法,并简化了下载这些库并将它们添加到类路径的过程。但是他们所做的就像您要下载库并手动将其添加到类路径中一样。

于 2013-01-04T17:20:13.350 回答