CLASSPATH,Java Buld Path(eclipse)和WEB-INF \ LIB:使用什么,何时以及为什么?
我最近从.NET切换到J2EE,并且对将JAR文件放在哪里感到困惑。 我知道CLASSPATH,WEB-INF和Eclipse的Java Web Path是所有可以存储JAR的地方,但我很困惑要使用哪个文件夹,何时以及为什么。
首先,我们有CLASSPATH。 我通常通过进入“我的电脑”中的“环境variables”进行设置。 我知道这是Java编译器查找JAR文件的默认位置。 当我将文件夹或JAR添加到CLASSPATH环境variables中时,为什么Eclipse,Java编译器和Web服务器会忽略它?
另外,我知道WEB-INF \ LIB是一个可以放置Web应用程序将要使用的JAR文件的地方。 但是,我已经把JAR放在WEB-INF \ LIB中,只是让它们被忽略。 在什么情况下,我应该把JAR放入WEB-INF \ LIB文件夹中? 如何让Eclipse或Web服务器注意到它们?
到目前为止,唯一对我有用的是实际上改变Eclipse项目的Java Build Path。 我将select我需要的JAR并点击“添加外部JAR”。 当我这样做的时候,Eclipse大部分时间都会识别我的JAR并读取其中的类。 然而,我遇到了一堆奇怪的随机错误,而这样做(主要是与依赖关系,我认为)。 出于某种原因,我只是觉得这不是正确的做事方式,我错过了一些重要的信息。 什么时候应该手动在Eclipse内部添加外部JAR,我应该什么时候做不同的事情? Eclipse的Java Build Path如何看起来不了解我的CLASSPATH环境variables中的文件夹?
真的,我只想更好地理解CLASSPATH,Eclipse的Java构buildpath和WEB-INF / LIB文件夹 – 它们所服务的目的,它们之间的关系,以及我应该把我的JAR放在哪里的情况。 我将不胜感激任何build议,你可以给我,或任何文章,你可以推荐。
谢谢。
您在环境中设置的CLASSPATH
只影响独立的Java应用程序,即从命令提示符或图标运行的应用程序。 正如你所看到的,Eclipse忽略了这一点。 它build立了自己的每个项目类path。
javac
和java
,如果从命令提示符调用,应该/可能会遵循这条path,但是这不再被认为是很好的做法。 事实certificate,每个应用程序都需要自己的一套东西,所以一个全球性的CLASSPATH其实并没有什么好处。 现代的做法是简单地在javac
或java
命令行上用-cp
选项指定类path。
独立的Web应用程序服务器也将build立自己的类path。 从命令行或GUI,WebAppServers通常由脚本( .BAT
或.sh
)启动,该脚本使用-cp
设置类path。 Tomcat有一个名为common
或common/lib
的目录,它希望看到应该可用的服务器以及运行在其下的所有程序。 但是你通常不需要/不想弄乱这个,因为它是应用程序在WEB-INF/lib
提供自己的库收集器的习惯。
因此,对于Web应用程序,假设Eclipse为您预先构build了这样一个目录结构,那么您可以将varous jar放入WEB-INF
下的lib
目录中。
所有你需要的库也需要被Eclipse知道。 在项目资源pipe理器中,我一次select它们的整体,右键单击并selectBuild Path | add to build path
Build Path | add to build path
。 这比手动修改Eclipse的项目构buildpath更容易。
Java有着悠久的历史,经验表明,一些想法是好的,有些是不好的。
CLASSPATH环境variables是告诉Java机器在哪里定位程序类的最初方式,对于命令行程序来说是相当不错的。 很快就发现,这不应该是一个全球性的东西(从长远来看,这会让事情变得糟糕),而是一个按计划进行的事情。 这可以通过创build一个包装脚本/ BAT文件来设置variables并运行Java机器来完成。
一切都很好,然后人们想用Java编写Web服务器的东西。 Servlet API是在Web应用程序是独立单元的情况下创build的 – 这导致每个 Web应用程序的CLASSPATH 都是 WEB-INF / classes下的解压缩文件以及WEB-INF / lib下的jar文件。 而只有这一点。 这意味着全局CLASSPATHvariables被忽略。 这被认为是一件非常好的事情,所以这个概念已经在其他地方移植了。
比如“java -jar foobar.jar”调用的“可执行jar”(Eclipse称之为“runnable jar”)包含了一个完整的类pathINSIDE Jar在一个特殊的清单文件中。 用于从Web服务器启动Java程序的Java Web Start明确列出了服务器上configuration文件中的完整类path。
但是,让你开始。 如果你想写一个Java Web应用程序:
- 获取Eclipse Java EE版本。
- 创build一个新的dynamicWeb项目,例如名为foobar。
- 在foobar / WebContent / WEB-INF / lib中拖放(或复制/粘贴)需要的jar文件
- 创build一个名为foobar / WebContent / index.jsp的新文件。 在空白文件中键入
<h1>Hello World <%= new java.util.Date() %></h1>
- 右键单击index.jsp的编辑器,selectRun – > Run on Server,然后在localhost服务器上selectBasic – > J2EE预览,然后selectFinish。
浏览器窗口现在将打开,无论是在浏览器或内部的Eclipse将呈现您的JSP页面。 您可以更改JSP页面,使用Ctrl-S保存并重新加载浏览器窗口以查看更改。
另外,我知道WEB-INF \ LIB是一个可以放置Web应用程序将要使用的JAR文件的地方。 但是,我已经把JAR放在WEB-INF \ LIB中,只是让它们被忽略。 在什么情况下,我应该把JAR放入WEB-INF \ LIB文件夹中? 如何让Eclipse或Web服务器注意到它们?
您在这里遇到的真正问题可能是您没有为Java EE开发人员提供Eclipse,或者您刚刚创build了一个通用Java项目而不是Dynamic Web Project,并且自己构build了必要的文件夹结构。
如果您在Eclipse中为Java EE开发人员创builddynamicWeb项目 ,那么Eclipse将自动将WEB-INF/lib
中的任何库添加到构buildpath中 。 构buildpath粗略地说就是在编译时和运行时都使用的类path。 换句话说,就是把第三方的JAR放在那里,真的没有什么需要做的了。
请注意,Java是区分大小写的,因此它应该被称为WEB-INF/lib
,而不是WEB-INF/LIB
。 但无论如何,如果您创build了一个dynamicWeb项目 ,那么Eclipse将自动为您生成正确的文件夹/文件结构。
正如别人所说,忽略%CLASSPATH%
环境variables。 它只被javac.exe / java.exe使用,甚至只有当你没有指定任何-cp
, -classpath
或者jar
参数的时候。 在现实世界中,这个环境variables很less使用,这对于初学者来说只是一些方便(不幸的是,也是最令人困惑的一个,他们不应该发明它)。
如果您正在处理Web应用程序,那么/ WEB-INF / lib是放置JAR的便携式场所。 这是Web服务器 servlet容器期望find应用程序的jar文件的地方。
Eclipse需要你指定你的库,jar文件的path(在Properties – > Java Build Path – > Libraries选项卡上)。 这可以在.classpath项目文件中find。
通常你的path上有JRE库(这也将在你的类path上),所以将这些库添加到类path中并更新eclipse构buildpath。
WEB-INF目录应该是包含您的Web应用程序所需信息的地方。
我不是一个Eclipse专家,但我认为你的问题可以这样回答:
1)CLASSPATH是一个环境variables,当你启动Java程序时被读入,并被类加载器用来确定类的放置位置。
我只是在从脚本启动java程序的情况下才会修改CLASSPATHvariables,因为这样可以方便地启动程序并确保find这些类。 当你正在开发Web应用程序时,你不会遇到这种情况。
2)WEB-INF / lib是Web应用程序容器的类加载器(如tomcat或glassfish)查看Web应用程序是否需要parsing类的目录。 所以你把那里在你的Web应用程序中使用的类。
有些IDE会将自动在项目中使用的库/ .jar文件自动包含到包中。
3)在开发期间parsingEclipse库/类path。 我会假设,但道歉假设,因为一个真的不应该这样做;),你可以定义一个库(外部.jar文件添加到项目)和自动完成/所有其他有趣的function应该开始使用这个,作为你基本上使这些类可见的IDE与该活动。 我也会假设你可以通过IDE将这些库标记为自动添加到Web项目等。
一般来说,在执行过程中如何find类是一个很好的阅读(这是一个太阳的官方文档)。 ClassLoader类文档也是一个很好的阅读。
综合起来,这些评论也帮助了我。 我已经将所有jena .jars添加到eclipse的构buildpath中,但这还不够。 在“添加到WEB-INF / lib”的build议之后,从库文件夹拖到WEB-INF(从eclipse里面)看起来很直观,但是没有成功。 也没有将.jars复制到WEB-INF。 我最终从Windows桌面拖放到Eclipse中的WEB-INF lib文件夹,并解决了这个问题。 如果添加到构buildpath的任何.jar被Eclipse自动复制到WEB-INF库,那将会很好。 如果是这样的话,这是在Windows 7上的Eclipse IDE,靛蓝版本。