仍然有Java库的问题

时间:2013-01-04 16:04:10

标签: java maven import jar httpclient

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

  1. 当我需要一个默认不带java的软件包时,我会谷歌并下载二进制文件。即“HttpClient”然后我从apache.org下载httpcomponents-client-4.2.2-bin.zip
  2. 我首先需要将.zip文件导入netbeans,然后使用import命令(通常会自动建议)。
  3. 我还有一些问题/问题。

    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

1 个答案:

答案 0 :(得分:4)

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

当JVM启动时,它需要加载将用于运行应用程序的类。要做到这一点,有3个类加载器在运行 - 引导类加载器,扩展类加载器和系统类加载器。 $ JAVA_HOME / lib和$ JAVA_HOME / lib / ext中jar文件的前2个加载类。它们基本上是让JVM运行所需要的 - 现在不要担心它们。第三个类加载器,系统类加载器,是你感兴趣的。这个系统类加载器使用类路径来查找要添加到JVM的类以形成你的申请。

对于类加载器还有更多功能,但现在可以做到。

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

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

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

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