您好,登錄后才能下訂單哦!
今天下午我做了一個關于學生信息管理系統的demo,主要功能是使用jdbc對學生信息進行增刪改查,整體的邏輯按照JNDI進行,使用oracle數據庫。
第一次運行,果不其然出現了異常,參照下圖:
經過檢查,我發現我oracle的jar包導入路徑錯了,沒有按照JNDI中的要求導入到tomcat文件夾下的lib文件夾中,而是導入到了項目的lib文件夾中。我向tomcat文件夾下的lib文件夾中添加了同名的jar包,我以為這樣一來,程序就能正常運行了。
然而并沒有。
異常還是這個異常,ClassNotFoundException,無法加載oracle數據庫的驅動。
我意識到可能是因為兩個同名的jar包同時存在,tomcat在處理上可能存在某一方面的優先級。于是我決定把之前錯誤路徑上的jar包給刪掉,只保留正確路徑上的jar包。經過這次改動,程序可以正常運行了。
到了這里,這個項目運行成功了,然而接下來才是正題。
項目成功運行后,我突發奇想,如果在已存在正確路徑中jar包的基礎上,在錯誤的路徑上再導入一個jar包,會不會重新產生異常呢?
答案再次出乎我的意料,還是沒有。程序運行得非常順利。
我逐漸意識到,這個現象的產生,可能與jar包導入的先后次序有關系。于是我新建了一個項目,項目內容與這個相同。我先導入了一個錯誤(指路徑不為tomcat文件夾下lib文件夾中的jar包,下文的正確同義)的jar包,運行程序,然后導入了正確的jar包,這次的運行結果與第一次運行的結果相同。
第二次,我先導入了一個正確的jar包,運行程序,然后導入了錯誤的jar包,這次的運行結果與上文運行成功的效果相同。
那么,如果正確和錯誤的jar包都存在,但是在兩個jar包都導入完成之前沒有運行程序,結果又會怎么樣呢?帶著這個疑問,我開始了第三次的測試。測試的結果是程序可以成功運行。
經過上面三次的測試,對于JNDI中jar包導入先后次序影響運行結果的問題,我簡單總結如下:
(1)某一時刻,只要運行了含有某個jar包的程序,即便在別的路徑導入一個同名的jar包,運行的結果都會與之前的一致。只有把先導入的jar包在其路徑中刪除,程序才會在另一個jar包的基礎上運行。可以把這種現象理解為一種“先入為主”的效果。
(2)在JNDI中,如果同時存在正確和錯誤的jar包,且在兩個jar包都導入完成前沒有運行程序,則程序能夠正常運行。
注:在本個demo中,我使用的是Java EE 5.0,Tomcat 6.0,更高級別的版本可能不會出現此類問題。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。