jar包直接拷贝到WEB-INF/lib下和以userLibrary引入的区别
jar包直接拷貝到WEB-INF/lib下和以userLibrary形式引入的區別?
jar包放置在WEB-INF/lib下和通過build path導入的區別是什么?
上一篇文章:【原創】java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener雖然提出了解決方案,但具體原因沒有探查,很多人會問究竟是為什么呢?
通俗的講是和classLoader有關,對于純java項目,它不存在WEB-INF目錄,所以在引入jar包的時候一般都是通過buildpath直接引入,例如我要引入Spring3X,那么先定義一個user library,然后通過build path引入。
純 java項目使用的本地自己的JRE,那么classLoader在加載jar和class時候是分開的,對于我們自己編寫的class,會在 APP_HOME/bin下。導入的jar包或者user library的配置信息會出現在APP_HOME/.classpath文件中,ClassLoader會很智能去加載這些classes和 jar。.classpath文件內容如下:
<?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>這樣ClassLoader就會正確的找到所有需要的類。
而對于java web項目,就不一樣了,雖然eclipse的workspace中仍然有.classpath文件,但即使你導入的了自己定義的user library,它也不會出現在.classpath中,這就是問題的關鍵。這到底是為什么呢???
對于java web項目,它最終不是通過本地的JRE去運行,而是部署到web 服務器,如Tomcat、Weblogic、WebSphere等,這些服務器都實現了自身的類加載器。
以Tomcat典型結果為例,它的目錄結構分別對應四個不同的類加載器,關系如下:
common?? ?? --- ?? CommonClassLoader
server???? ? ? ---? ? CatalinaClassLoader
shared??????? ---??? SharedClassLoader
webapps? ?? ---??? WebappClassLoader
我們的 web 應用都是部署到 webapps 目錄下,而WebappClassLoader加載器專門負責加載 webapps 下所有web項目的 WEB-INF 下的類庫和類文件。而我們通過 user library 引入的 jar 包自然不會被 WebappClassLoader 加載器加載,所以才會出現 ClassNotFoundException 。
延伸閱讀:
http://topic.csdn.net/u/20111124/14/246c7af8-d752-423d-a2e5-1b94da53456a.html
轉載于:https://www.cnblogs.com/orientsun/archive/2012/11/04/2753283.html
總結
以上是生活随笔為你收集整理的jar包直接拷贝到WEB-INF/lib下和以userLibrary引入的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ant in Action读书笔记(三)
- 下一篇: JS 数组 各项操作