弄了一下午才解決的log4j問題#####
在一個webservice項目中,引入log4j來記錄Exception日志奕纫,本來很簡單的功能铡买,可是由于思維方式的不對叶骨,導(dǎo)致問題用了3個小時才解決,客戶端調(diào)用服務(wù)端的時候一直報 java.lang.ClassNotFoundException: org.apache.log4j.Logger錯誤绷耍,搜索了很多資料吐限,最后看到一個人說要把log4j的包copy到WEB-INF目錄下的lib文件夾中,如此操作后褂始,果然可以記錄日志诸典,這使我好奇一個問題移层,項目可以通過buildpath對包進行依賴咙边,同時可以把包copy到lib目錄下進行依賴,二者之間有什么區(qū)別斑唬?
我們可以通過java虛擬機的類加載器來理解胆数。
通過buildpath設(shè)置(或添加)程序使用jar包的classpath肌蜻。
Java虛擬機是根據(jù)Java ClassLoader(類加載器)決定如何,到那里去加載Class
我們之所以把jar包放在classPath下必尼,是因為存在ClassPath ClassLoader
我們之所以可以不再ClassPath指定一些Jar包蒋搜,但在Java程序中也能使用。
那是因為有 Root ClassLoader(由C++編寫)
我們之所以把Jar包放入webroot下的lib文件夾,并且可以在我們的程序中使用豆挽,那是容器實現(xiàn)了自己的ClassLoader酸休。
所以說能不能加載Jar,加載哪里的Jar祷杈,是根據(jù)ClassLoader決定的斑司。
系統(tǒng)默認提供了3個ClassLoader
Root ClassLoader -> ClassPathLoader -> ExtClassLoader(用于加載Java虛擬機ext目錄下的Jar)
當(dāng)然我們也可以編寫自己的ClassLoader,去加載特定環(huán)境下的Jar文件但汞。
你可以去看看ClassLoader的相關(guān)介紹(想深入了解java虛擬機的話)宿刮。
Eclipse只是一個開發(fā)工具,至于采用導(dǎo)入方式Copy Jar包私蕾,還是采用僵缺,手動Copy到webroot\lib目錄下,都是一樣的踩叭。
因為如果你做的是WEB開發(fā)的話磕潮,不管你是采用Eclipse導(dǎo)入方式還是采用手動拷貝的方式,最后那些Jar都會被放在webroot/lib目錄下容贝。
當(dāng)然利用Eclipse去導(dǎo)入Jar包也有一些要注意的地方自脯,比如Eclipse下方會有英文的提示信息"是否將Jar包拷貝到WebRoot/Lib"下,如果沒有選中斤富,
你會驚訝的發(fā)現(xiàn)我的程序也能運行膏潮。。满力。
這是因為Eclipse在這種情況下焕参,自動將這個Jar包設(shè)置成ClassPath形式了。
如果換一臺機器油额,你的程序就不能運行了叠纷。原因很簡單,
因為不是所以機器都有ClassPath的潦嘶。也更不會像Eclipse那樣涩嚣,自動的為為程序在啟動前設(shè)置Jar的ClassPath。