開發j2ee項目的時候,需要用到servlet-api,如果使用了maven,web項目可以在pom.xml中手動加入所需jar包,達到與依賴j2ee libarary同樣的功能。可問題來了:
1. 問題描述
最近使用myeclipse10.7用maven開發一個web項目,就遇到了這樣一個問題:
由於項目的servlet類中使用了servlet-api-3.0相應的方法,即HttpServletRequest類的一個getServletContext()方法,
為了使編譯通過,可在build path中添加j2ee6 libarary,或者pom.xml中引入servlet-api-3.0.jar,但雖然通過這2種方法引入使編譯成功后,
運行時,servlet中仍然報找不到getServletContext()方法的錯誤。
2. 分析結果
追查問題后,分析可能的原因是,如果使用的是tomcat6服務器,由於tomcat6安裝目錄下自帶的是servlet-api-2.5.jar,不支持servlet-3.0,
由此進行猜測,web應用在tomcat中運行時,運行時與編譯時是不一樣的。
編譯使用的項目build path引入的jar包進行編譯,編譯完成后,運行時,tomcat應該是使用了其自帶的j2ee jar包來運行web應用的,我們項目build path中引入的j2ee 相關jar包,在tomcat容器運行web項目時,已經不起作用了!
3. 待解決的問題
問題來了,有沒有一種方法,使得web項目在tomcat容器中運行時,能夠優先使用我們指定的jar包呢?正在百度當中。
4. 分析結果糾正
即使把servlet-api-3.0jar包替換掉tomcat6的lib目錄下的servlet-api.jar包,也並不能解決問題,說明了並不是web項目運行時優先加載tomcat自帶jar這種原因,而是tomcat6不支持servlet-api-3.0,使用tomcat7后,問題解決了,也說明了這個問題。
注意,如果反過來把servlet-api-2.5替換掉tomcat7目錄下的servlet-api包,則容器直接無法成功啟動了。