如何将JAR库添加到WAR项目而不面临java.lang.ClassNotFoundException? 类pathvs构buildpathvs / WEB-INF / lib
我应该如何添加JAR库到Eclipse中的WAR项目,而不面临java.lang.ClassNotFoundException
或java.lang.NoClassDefFoundError
?
CLASSPATH
环境variables似乎不起作用。 在某些情况下,我们将JAR文件添加到Eclipse项目的Build Path属性中,以便编译代码。 我们有时需要将JAR文件放入Java EE Web应用程序的/WEB-INF/lib
文件夹中,以使代码在该JAR中的类上运行。
我不完全明白为什么CLASSPATH
不起作用,在这种情况下,我们应该将JAR添加到Build Path,以及这些JAR究竟应该放在/WEB-INF/lib
。
CLASSPATH
环境variables只能由java.exe
命令使用,即使在没有任何-cp
, -classpath
, -jar
参数的情况下也是如此。 它被诸如Eclipse,Netbeans和IDEA之类的IDE所忽略。 尽pipe使用了CLASSPATH环境variables,也参见java.lang.ClassNotFoundException 。
构buildpath只适用于需要编译项目代码的库。 手动将JAR放入/WEB-INF/lib
或设置部署程序集 ,或者让外部构build系统(如Maven)在生成过程中将<dependency>
作为JAR放入生成的WAR的/WEB-INF/lib
中,仅用于库这些代码也需要在目标环境中部署和运行。 请注意,您不应该在/WEB-INF/lib
创build子文件夹。 JAR必须放在根中。
一些库已经由目标Java EE服务器或servlet容器提供,如JSP,Servlet,EL等。因此,您不需要将这些库的JAR放在/WEB-INF/lib
。 而且,这只会造成类加载的麻烦。 仅在构buildpath中 (间接)指定它们就足够了。 在Eclipse中,通常通过相应地设置目标运行时来实现 。 它会自动结束在生成path 。 另请参见如何在Eclipse项目中导入javax.servlet API?
其他库,通常是目标servlet容器(如Tomcat不支持JSF,CDI,JPA,EJB等)提供的Apache Commons,JDBC驱动程序和标准库等第三方库,最终需要在/WEB-INF/lib
。 您不一定需要在Build Path中指定它。 只有当你已经拥有它作为用户库 ,但你应该使用部署程序集设置。 在Eclipse构buildpath中使用用户库时,请参见ClassNotFoundException 。
如果你使用的是Maven,那么你需要确保你把库标记为<scope>provided</scope>
如果这些已经被目标运行时提供的,例如Java EE,Servlet,EL等你部署到WildFly,TomEE等等。这样,它们不会最终在/WEB-INF/lib
WAR生成的WAR文件的/WEB-INF/lib
中(可能会导致与服务器捆绑的库冲突),但是它们会在Eclipse的Build Path中生成得到项目的代码来编译)。
构buildpath中的那些JAR仅用于构build(编译)过程。 如果您导出Web应用程序,它们不包含在最终的WAR中(请试一试)。
如果您在运行时需要JAR,则必须将它们放在WEB-INF / lib或服务器类path中。 如果几个WAR共享一个公共代码库并且需要访问共享对象(例如Singleton),那么将JAR放在服务器类path中是有意义的。
如果您使用Maven :
打开项目属性,然后在部署程序集下单击添加…
然后selectJava Build Path Entries并selectMaven Dependencies
我只想给出下面的链接问题的答案ClassNotFoundException oracle.jdbc.driver.OracleDriver只有在servlet中,使用Eclipse
回答:在Myeclipse中去服务器 – >左键单击Myeclipse Tomcat7 – >configuration服务器连接器 – >(展开)Myeclipse Tomcat7 – >path – >预先添加到classpath – >添加jar(添加oracle14 jar) – – >确定