【问题标题】:CLASSPATH, Java Buld Path (eclipse), and WEB-INF\LIB : what to use, when, and why?CLASSPATH、Java 构建路径 (eclipse) 和 WEB-INF\LIB:使用什么、何时以及为什么?
【发布时间】:2010-12-21 18:00:20
【问题描述】:

我最近从 .NET 切换到 J2EE,但对将 JAR 文件放在哪里感到困惑。我知道 CLASSPATH、WEB-INF 和 Eclipse 的 Java Web 路径都是可以存储 JAR 的地方,但我对使用哪个文件夹、何时以及为什么使用感到困惑。

首先,我们有 CLASSPATH。我通常通过进入“我的电脑”中的“环境变量”来设置它。我知道这是 Java 编译器查找 JAR 文件的默认位置。当我将文件夹或 JAR 添加到我的 CLASSPATH 环境变量时,为什么 Eclipse、Java 编译器和 Web 服务器会忽略它?

另外,我知道 WEB-INF\LIB 是一个可以放置 Web 应用程序将要使用的 JAR 文件的地方。但是,我将 JAR 放在 WEB-INF\LIB 中只是为了让它们被忽略。在什么情况下我应该将 JAR 放入 WEB-INF\LIB 文件夹中?如何让 Eclipse 或 Web 服务器注意到它们?

到目前为止,唯一对我有用的是实际更改 Eclipse 项目的 Java 构建路径。我将选择我需要的 JAR,然后点击“添加外部 JAR”。大多数时候,当我这样做时,Eclipse 会识别我的 JAR 并读取其中的类。但是,我在执行此操作时遇到了一堆奇怪的随机错误(我认为主要与依赖关系有关)。出于某种原因,我只是觉得这不是做事的正确方式,而且我错过了一些重要的信息。什么时候应该在 Eclipse 中手动添加外部 JAR,什么时候应该以不同的方式做事?为什么 Eclipse 的 Java 构建路径似乎不知道我的 CLASSPATH 环境变量中的文件夹?

真的,我只是想更好地了解 CLASSPATH、Eclipse 的 Java 构建路径和 WEB-INF/LIB 文件夹——它们的用途、它们之间的关系以及我应该把我的各种情况下的 JAR。如果您能给我任何建议,或者您可以推荐的任何文章,我将不胜感激。

谢谢。

【问题讨论】:

  • 哦,还有一个问题——如果我的 Web 应用程序需要某个 JAR,我是否需要将该 JAR 添加到运行配置以及项目的构建路径中?运行配置和构建路径是否总是完全分开的,还是会影响另一个?
  • (是的,假设我正在从 Eclipse 运行我的 Web 项目)
  • 我们如何为 EAR/lib 页面做到这一点? stackoverflow.com/questions/29753457/… 问候,

标签: java eclipse jakarta-ee jar classpath


【解决方案1】:

您在环境中设置的CLASSPATH 仅影响独立的 Java 应用程序,即您从命令提示符或图标运行的应用程序。正如您所注意到的,Eclipse 忽略了这一点。它为每个项目设置自己的类路径。

javacjava,如果从命令提示符调用,应该/可能会遵循此路径,但不再认为这样做是很好的做法。事实证明,每个应用程序都需要自己的一组东西,因此全局 CLASSPATH 并没有真正对其中任何一个有任何好处。现代的做法是在命令行中为javacjava 简单地使用-cp 选项指定类路径。

独立的 Web 应用程序服务器也将设置自己的类路径。从命令行或 GUI,WebAppServers 通常由一个使用-cp 设置类路径的脚本(.BAT.sh)启动。 Tomcat 有一个名为commoncommon/lib 的目录,它希望在该目录中查看应该在服务器上可用的库以及在其下运行的所有程序。但是您通常不需要/不想搞砸这一点,因为应用程序通常会在 WEB-INF/lib 中提供自己的库集合。

因此,对于 Web 应用程序,假设 Eclipse 为您预先构建了这样的目录结构,您可以将各种 jar 放入 lib 目录下的 WEB-INF

您需要的所有库也需要让 Eclipse 知道。在 Project Explorer 中,我一次选择了所有这些,右键单击并选择 Build Path | add to build path。这比手动弄乱 Eclipse 的项目构建路径要容易。

【讨论】:

  • 要记住的一点是,Eclipse 会识别所有jar 下的WEB-INF/lib,我们不需要将它们添加到构建路径中。仅对其他路径中的jar 是必需的。
【解决方案2】:

Java 有着悠久的历史,经验表明,有些想法是好的,有些是坏的。

CLASSPATH 环境变量是告诉 Java 机器从您的程序中定位类的初始方法,并且对于命令行程序工作得相当好。人们很快发现这不应该是一个全局的事情(因为从长远来看这往往会搞砸事情),而是一个每个程序的事情。这可以通过创建一个设置变量并运行 Java 机器的包装脚本/BAT 文件来完成。

一切都很好,然后人们想用 Java 编写 Web 服务器的东西。 Servlet API 是在 Web 应用程序是独立单元的情况下创建的 - 这导致 每个 Web 应用程序的 CLASSPATH WEB-INF/classes 下的解压缩文件加上 WEB-INF/lib 下的 jar 文件。仅此而已。这意味着全局 CLASSPATH 变量被忽略。发现这是一件非常的好事,所以这个概念已经转移到其他地方。

例如,使用“java -jar foobar.jar”调用的“可执行 jar”(Eclipse 将其称为“可运行 jar”)在特殊清单文件中包含 Jar 内的完整类路径。 Java Web Start 用于从 Web 服务器启动 Java 程序,它在服务器上的配置文件中明确列出了完整的类路径。

但是,让你开始。如果你想写一个 Java Web 应用程序:

  1. 获取 Eclipse Java EE 版本。
  2. 创建一个新的动态 Web 项目,例如名为 foobar。
  3. 在 foobar/WebContent/WEB-INF/lib 中拖放(或复制/粘贴)您需要的 jar 文件
  4. 创建一个名为 foobar/WebContent/index.jsp 的新文件。在空白文件中输入<h1>Hello World <%= new java.util.Date() %></h1>
  5. 在 index.jsp 的编辑器中右键单击,选择 Run -> Run on Server,然后选择 Basic -> J2EE preview at localhost server,然后完成。

现在将在浏览器中或在 Eclipse 中打开一个浏览器窗口,该窗口将呈现您的 JSP 页面。您可以更改 JSP 页面,使用 Ctrl-S 保存并重新加载浏览器窗口以查看更改。

【讨论】:

  • @SanderVerhagen 我不明白你的评论。问题显然是在 Web 容器的上下文中(通常在 Java SE 中运行)。
  • @SanderVerhagen 否。所有与 servlet 及以上相关的所有支持都在预装 EE 的插件中(您可以从 Marketplace for SE 安装)。不用 EJB,你也可以做普通的 WAR。
  • 如今开始使用 Web 应用程序的最简单方法是使用 Netbeans+Glassfish 捆绑包。
【解决方案3】:

另外,我知道 WEB-INF\LIB 是一个可以放置 Web 应用程序将要使用的 JAR 文件的地方。但是,我将 JAR 放在 WEB-INF\LIB 中只是为了让它们被忽略。在什么情况下我应该将 JAR 放入 WEB-INF\LIB 文件夹中?如何让 Eclipse 或 Web 服务器注意到它们?

您遇到的真正问题很可能是您没有得到Eclipse for Java EE developers 和/或您刚刚创建了一个通用Java 项目 而不是一个Dynamic Web Project并自己建立必要的文件夹结构。

如果您在 Eclipse 中为 Java EE 开发人员创建一个动态 Web 项目,那么 Eclipse 会自动将 WEB-INF/lib 中的任何库添加到 构建路径。 构建路径 粗略地说只是在编译时和运行时都使用的类路径。换句话说:只需将 3rd 方 JAR 放在那里,真的不需要做更多的事情。

请注意,Java 区分大小写,因此它应该真正称为WEB-INF/lib,而不是WEB-INF/LIB。但无论如何,如果您创建一个动态 Web 项目,那么 Eclipse 会自动为您生成正确的文件夹/文件结构。

正如其他人所说,忽略%CLASSPATH% 环境变量。它是 only 由 javac.exe/java.exe 使用的,即使在您 not 指定任何 -cp、@ 时 only 987654327@ 或 -jar 参数。在现实世界中,这个环境变量很少使用,它只是为初学者提供一些便利(不幸的是,也是最令人困惑的一个,他们不应该发明它)。

【讨论】:

    【解决方案4】:

    如果您正在处理 Web 应用程序,/WEB-INF/lib 是放置 JAR 的可移植位置。这是 web 服务器 servlet 容器期望找到应用程序的 jar 文件的地方。

    【讨论】:

      【解决方案5】:

      Eclipse 要求您指定库、jar 文件的路径(在 Properties -> Java Build Path -> Libraries 选项卡上)。这可以在 .classpath 项目文件中找到。

      通常您的路径上有 JRE 库(也将在您的类路径中),因此将库添加到类路径并更新 eclipse 构建路径会起作用。

      WEB-INF 目录应该是包含 Web 应用程序所需信息的地方。

      【讨论】:

        【解决方案6】:

        我不是 Eclipse 专家,但我认为您的问题可以这样回答:

        1) CLASSPATH 是一个环境变量,当你启动 java 程序时会读入它,类加载器使用它来确定类的放置位置。

        我只会在您从脚本启动 java 程序时修改 CLASSPATH 变量,因为这使您可以方便地启动程序并确保找到类。对您而言,情况并非如此,因为您正在开发 Web 应用程序。

        2) WEB-INF/lib 是 Web 应用程序容器的类加载器(如 tomcat 或 glassfish)在您的 Web 应用程序需要解析类时查找的目录。因此,您将在 Web 应用程序中使用的类放在那里。

        某些 IDE 会自动将您在项目中使用的库/.jar 文件包含在包中。

        3) Eclipse 库/类路径在开发期间解析。我会假设,但很抱歉假设,因为一个人真的不应该这样做;),您可以定义一个库(将外部 .jar 文件添加到项目中)和自动完成/所有其他有趣的功能应该开始使用这个,因为您基本上可以通过该活动使这些类对 IDE 可见。我还假设您可以将这些库标记为由 IDE 自动添加到 Web 项目等。

        一般来说,关于在执行期间如何找到类的好读物是here(这是 sun 的官方文档)。 ClassLoader 类文档也是一个阅读相关内容的好地方。

        【讨论】:

        • (1) 不,Eclipse 希望通过项目的构建路径明确地公开库。 (2) Sun 的类加载器文档是权威的、完整的和指导性的,但是在 IDE 中工作时,它仅作为背景信息有用。 Eclipse 努力为用户抽象出这些问题;虽然通常是有益的,但这可能会让初学者感到困惑。
        【解决方案7】:

        总之,cmets 也帮助了我。我已将所有 jena .jar 添加到 eclipse 的构建路径中,但这还不够。按照“添加到 WEB-INF/lib”的建议,从库文件夹拖动到 WEB-INF(从 Eclipse 中)似乎很直观,但这不起作用。也没有将 .jars 复制到 WEB-INF。我最终从 Windows 桌面拖放到 Eclipse 中的 WEB-INF lib 文件夹,这解决了问题。如果 Eclipse 自动将任何添加到构建路径的 .jars 复制到 WEB-INF 库中,那就太好了。如果重要的话,这是 Windows 7 上的 Eclipse EE IDE,Indigo 版本。

        【讨论】:

          猜你喜欢
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 2010-10-29
          • 2015-10-23
          • 2014-07-21
          • 1970-01-01
          • 2012-11-20
          相关资源
          最近更新 更多