maven工程部署到tomcat伺服器過程中遇到的問題總結
1、部署到自己配置的tomcat伺服器上遇到的錯誤
我按照網上的步驟,在myeclipse中配置了maven、tomcat,還整理了下配置的過程。但是發現會出現各種錯誤,主要是
Server returned HTTP response code: 403 Cannot invoke Tomcat manager: unknown protocol:plugin found for prefix 'tomcat7' in the current project and in the plugin groups
網上一直在說:產生該問題有可能因為兩個原因,具體參見解決辦法
解決辦法:
1)如果使用的是Tomcat 7,需要修改pom.xml中部署的url地址,將<url>http://localhost:8080/manager</url>改<url>http://localhost:8080/manager/text</url>
2)給tomcat使用者許可權分配上,需要同時具備manager-gui和manager-script許可權,我在遇到該問題時,就是忘了分配manager-script許可權。
正確的conf/tomcat-users.xml配置應為:
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin” password="admin" roles="manager-gui, manager-script"/>
</tomcat-users>
但是我試了很多次都沒用,還是報這個錯誤,並且是不是出來各種奇怪的錯誤,這個錯誤折騰了我一天。終於,我請教了同學,之前我部署的命令一直是
tomcat6:deploy,同學建議我用tomcat6:run,這兩者的區別是前者部署到外部伺服器,後者部署到myeclipse內部伺服器上,後來我直接放棄了部署到外部伺服器上,選擇了部署到內部伺服器上,上面那個錯誤終於沒有出現了,還是部署到內部伺服器上方便快捷。
2、 部署到內部伺服器上後出現的錯誤
java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
在網上找了下原因,大概說的是我的servler-api.jar包衝突,原因解釋如下:
使用maven生成web工程後,編譯需要下servlet-api.jar和jsp-api.jar檔案。
tomcat 啟動後先將tomcat/lib目錄下的jar包全部讀入記憶體,如果webapps目錄裡的應用程式中WEB-INF/lib目錄下有相同的包,將無法載入,
不同版本的包之間也會造成類似問題
解決這個問題的方法就是對於servlet-ap.jar 使用 <scope>標籤,編譯的時候用到servlet-api和jsp-api,但在打包的時候不用這兩個依賴,如下
<span style="font-family:Comic Sans MS;"> <strong><dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency></strong></span>
pom檔案中的寫法為:
<span style="font-family:Comic Sans MS;"><strong><dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1-b02</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency></strong></span>
這種寫法在使用mvn targe命令時有效的,但是在eclipse下run on server下,會把依賴的mavne dependencies這個library下面的全部jar都載入到tomcat的部署目錄下面去。 個人認為這是eclipse的maven外掛的不相容導致的。
解決這種衝突有兩種
1:把載入後的刪掉
2:把server runtime這個library加到build path下面去。
原來真的是maven動態web專案jar包衝突的問題,不過我的不是servler-api.jar包衝突,而是我在pom.xml多寫了一個
tomcat7-maven-plugin的dependency,所以造成了jar包衝突,終於一大堆的問題解決了,web工程終於可以部署到tomcat伺服器上運行了,
這些問題整整折磨了我兩天。