我最近从.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在各种情况下。如果您能给我任何建议,或者您推荐的任何文章,我将不胜感激。
谢谢。
答案 0 :(得分:30)
您在环境中设置的CLASSPATH
仅影响独立的Java应用程序,即从命令提示符或图标运行的应用程序。正如您所注意到的,Eclipse忽略了这一点。它设置了自己的每个项目类路径。
javac
和java
,如果从命令提示符调用,应该/可能会遵循此路径,但这不再是一种很好的做法。事实证明,每个应用程序都需要自己的东西,所以全局CLASSPATH并没有真正做任何好事。现代做法是在-cp
或javac
的命令行中使用java
选项指定类路径。
独立的Web应用程序服务器也将设置自己的类路径。从命令行或GUI,WebAppServers通常由脚本(.BAT
或.sh
)启动,该脚本使用-cp
设置类路径。 Tomcat有一个名为common
或common/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应用程序:
<h1>Hello World <%= new java.util.Date() %></h1>
浏览器窗口现在将在浏览器或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发行版。