1. 程式人生 > >maven工程部署到tomcat伺服器過程中遇到的問題總結

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伺服器上運行了,
 這些問題整整折磨了我兩天。