今天在本身家裏的電腦上改一個項目,安裝的是社區版的 IntelliJ Idea, 沒有辦法安裝 Tomcat 插件來啓動項目。嘗試用 jettry runer 啓動,結果報java
java.lang.IncompatibleClassChangeError: class org.eclipse.jetty.annotations.AnnotationParser$MyClassVisitor has interface
org.objectweb.asm.ClassVisitor as super class
在網上找了半天也沒解決,因而改成用 maven-tomcat-plugin,配置很簡單,以下:web
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin>
運行也簡單,命令行執行:apache
mvn tomcat7:run
不過立刻就報錯了,提示:api
Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/servlet/ServletContext"
提示很明顯看出來是 servlet-api 版本不兼容。解決方法爲,將 pom.xml 裏的 servlet-api 改成 provided,不然項目啓動時與 tomcat 內置 servlet 衝突。再次運行,又報錯了:tomcat
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application
[/demo-web] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
The class hierarchy being processed was [org.jaxen.util.AncestorOrSelfAxisIterator->org.jaxen.util.AncestorAxisIterator->
org.jaxen.util.AncestorOrSelfAxisIterator]
多運行了幾回,發現有 3 次成功,2 次報上面的錯,網上找到的解釋 tomcat啓動時檢測到循環繼承而棧溢出的問題,將項目傳遞依賴的 jaxen exclude 以後從新運行成功。app