CLASSPATH,Java构建路径(eclipse)和WEB-INF \ LIB:使用什么,何时以及为什么?

时间:2009-11-30 18:35:35

标签: java eclipse java-ee jar classpath

我最近从.NET切换到J2EE,并且对于放置JAR文件的位置感到困惑。我知道CLASSPATH,WEB-INF和Eclipse的Java Web Path都是可以存储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 Build Path。我将选择我需要的JAR并点击“Add External JARs”。大多数时候,当我这样做时,Eclipse会识别我的JAR并阅读其中的类。但是,我这样做时遇到了一堆奇怪的随机错误(我认为这主要与依赖关系有关)。出于某种原因,我只是觉得这不是正确的做事方式,而是我错过了一些重要的信息。我什么时候应该在Eclipse中手动添加外部JAR,何时应该以不同的方式做事?为什么Eclipse的Java Build Path似乎不知道我的CLASSPATH环境变量中的文件夹?

真的,我想更好地理解CLASSPATH,Eclipse的Java构建路径和WEB-INF / LIB文件夹 - 它们服务的目的,它们之间的关系,以及我应该把它放在哪里JAR在各种情况下。如果您能给我任何建议,或者您推荐的任何文章,我将不胜感激。

谢谢。

7 个答案:

答案 0 :(得分:30)

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

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

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

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

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

答案 1 :(得分:11)

Java历史悠久,经验表明,有些想法很好,有些想法很糟糕。

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

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

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

但是,为了让你开始。如果您想编写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 - &gt;在服务器上运行,然后选择基本 - &gt;本地主机服务器上的J2EE预览,以及完成。
  6. 浏览器窗口现在将在浏览器或Eclipse内部打开,这将呈现您的JSP页面。您可以更改JSP页面,使用Ctrl-S保存它并重新加载浏览器窗口以查看更改。

答案 2 :(得分:4)

  

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

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

如果您在 Eclipse for Java EE开发人员中创建动态Web项目,则Eclipse会自动将WEB-INF/lib中的任何库添加到构建中路径构建路径大致只是在编译时和运行时使用的类路径。换句话说:只需将第三方JAR放在那里,真的不需要做任何事情。

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

通常你的路径上有JRE库(也可以在你的类路径上),所以将libs添加到类路径并更新eclipse构建路径也行。

WEB-INF目录应该是包含Web应用程序必要信息的位置。

答案 5 :(得分:2)

我不是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(这是太阳的官方文档)。另外,阅读这个的好地方是ClassLoader类文档。

答案 6 :(得分:2)

这些评论合在一起对我有帮助。我已经将所有jena .jars添加到了eclipse的构建路径中,但这还不够。根据“添加到WEB-INF / lib”的建议,将库文件夹拖到WEB-INF(从eclipse中)看起来很直观,但这不起作用。也没有将.jars复制到WEB-INF。我最终从Windows桌面拖放到Eclipse中的WEB-INF lib文件夹,这解决了问题。如果添加到构建路径的任何.jars被Eclipse自动复制到WEB-INF lib,那将是很好的。如果重要的话,那就是Windows 7上的EE IDE,Indigo发行版。