jar包置放在WEB-INF/lib下和經過build path導入的區別是什麼

問題: 一、web架包找不到 二、maven項目轉變web項目經過 Deployment Assembly把架包添加到WEB-INF/lib引發的架包衝突java

  通俗的講是和classLoader有關,對於純Java項目,它不存在WEB-INF目錄,因此在引入jar包的時候通常都是經過buildpath直接引入,例如我要引入Spring3X,那麼先定義一個user library,而後經過build path引入。node

  純java項目使用的本地本身的JRE,那麼classLoader在加載jar和class時候是分開的,對於咱們本身編寫的class,會在APP_HOME/bin下。導入的jar包或者user library的配置信息會出如今APP_HOME/.classpath文件中,ClassLoader會很智能去加載這些classes和jar。.classpath文件內容以下:web

  < xml version="1.0" encoding="UTF-8" >
<classpath>
  <classpathentry kind="src" path="src"/>
  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/>
  <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Spring3.1.0"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/cglib/cglib-2.2.2.jar" sourcepath="E:/Jar_Framework/cglib/cglib-src-2.2.2.jar"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/commons-logging-1.1.1-bin/commons-logging-1.1.1/commons-logging-1.1.1.jar"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/aopalliance-1.0/aopalliance-1.0.jar"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/cglib/cglib-nodep-2.2.2.jar"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/aspectj-1.6.12.jar"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/aspectjweaver-1.6.8.jar"/>
  <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/asm-3.2.jar"/>
  <classpathentry kind="output" path="bin"/>
</classpath>spring

  這樣ClassLoader就會正確的找到全部須要的類。tomcat

  而對於Java web項目,就不同了,雖然eclipse的workspace中仍然有.classpath文件,但即便你導入的了本身定義的user library,它也不會出如今.classpath中,這就是問題的關鍵。這究竟是爲何呢???服務器

  對於java web項目,它最終不是經過本地的JRE去運行,而是部署到web 服務器,如Tomcat、Weblogic、WebSphere等,這些服務器都實現了自身的類加載器。
好比tomcat應用服務器,它有其本身的類加載器,根據J2EE的規範去%web-project%/WEB-INF/lib的規範去找相應的lib,這就是爲何咱們發佈的WEB應用要符合那個格式 
以Tomcat典型結果爲例,它的目錄結構分別對應四個不一樣的類加載器,關係以下:app

  common   ---  CommonClassLoader框架

  server     ---  CatalinaClassLoadereclipse

  shared     ---  SharedClassLoaderwebapp

  webapps   ---  WebappClassLoader

  咱們的 web 應用都是部署到 webapps 目錄下,而WebappClassLoader加載器專門負責加載 webapps 下全部web項目的 WEB-INF 下的類庫和類文件。而咱們經過 build path 引入的 jar 包天然不會被 WebappClassLoader 加載器加載,因此纔會出現 ClassNotFoundException 。

  eclipse引用library 是爲了編譯代碼生成WEB-INF/classes裏面的class文件使用,使用eclipse j2ee IDE時,會將WEB-INF/lib中全部的lib自動加入到library中  eclipse工程下的library是用來編譯裏面的src中java文件的 實際發佈到tomcat時,僅僅只複製了WEB-INF/lib裏面的jar包,因此出現eclipse能夠正常編譯但tomcat運行是找不到類, 若是你是用的eclipse j2ee IDE,你去WorkSpace\.metadata\.plugins\*re\wtpwebapps找到運行時發佈的工程就能夠明白了  說白了就是用eclipse j2ee IDE開發web的時候,若是是編譯java代碼用到的jar能夠做爲library引用,若是是框架非java代碼部分用到的jar就必須放在lib下面。

相關文章
相關標籤/搜索