【问题标题】:Still having issues with java librariesjava库仍然有问题
【发布时间】:2013-01-04 16:04:10
【问题描述】:

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

  1. 当我需要一个包时,Java 默认不提供该包,然后我用谷歌搜索它并下载二进制文件。即“HttpClient”然后我从 apache.org 下载httpcomponents-client-4.2.2-bin.zip
  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

【问题讨论】:

  • 你没有考虑过使用 Maven 吗? :) 添加和管理依赖项非常简单。看看这个:maven.apache.org
  • 您应该导入 *.jar,而不是 *.zip 发行版。你会在 /lib 子目录下的 *.zip 中找到这些 jars
  • 你需要了解包的工作原理。
  • 我会去看看 Maven,谢谢你的建议。 @radai 我认为那是我的错误,您想回答以进行检查吗? SLaks 这正是我想要做的。
  • 使用 Maven 只会隐藏真正的答案 - 您需要将 zip 中的 jar 文件添加到应用程序的类路径中,并且您需要了解类路径和包。

标签: java maven import jar httpclient


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 关于 JAR 文件的小问题:“标准目录”和其他元数据文件完全是可选的。 .zip 的类文件也可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多