Maven, tomcat7, Simple Web App. java.lang.LinkageError: loader constraint violation
Maven, tomcat7, Simple Web App. java.lang.LinkageError: loader constraint violation
我正在按照书本 "Introducing Maven, Apress" 中的说明创建一个简单的 Web 应用程序:HelloWorld!!在 JSP 中。使用 Maven 和 Tomcat7 并使用以下工件:(顺便说一句,我使用的是 win7)
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp
创建的结构如下:
gswm-web
|_pom.xml
|_src
|_main
|_resources
|_webapp
|_WEB-INF
| |_web.xml
|_index.jsp
和 pom.xml 如下所示,添加了 tomcat 插件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.apress.gswmbook</groupId>
<artifactId>gswm-web</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>gswm-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>gswm-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
然后我 运行 从项目根目录中的命令行执行以下命令:
mvn tomcat7:run
我得到以下信息:
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------------------------------------------------
----
[INFO] Building gswm-web Maven Webapp 1.0-SNAPSHOT
[INFO] ---------------------------------------------------------------------
---
[INFO]
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ gswm-web >>>
Downloading: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.pom
Downloaded: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.pom
Downloading: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.jar
Downloaded: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.jar
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ gswm-
web ---
[debug] execute contextualize
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered
resources, i.e. build is
platform dependent!
[INFO] skip non existing resourceDirectory
C:\MauricioFiles\Maven\gswm-book-master\gswm-book-
master\chapter6\final\gswm-web\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ gswm-web
---
[INFO] No sources to compile
[INFO]
[INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) @ gswm-web <<<
[INFO]
[INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ gswm-web ---
[INFO] Running war on http://localhost:8080/gswm-web
[INFO] Creating Tomcat server configuration at
C:\MauricioFiles\Maven\gswm-book-master\gswm-book-
master\chapter6\final\gswm-web\target\tomcat
[INFO] create webapp with contextPath: /gswm-web
Jun 03, 2015 1:50:08 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Jun 03, 2015 1:50:08 PM org.apache.catalina.core.StandardService
startInternal
INFO: Starting service Tomcat
Jun 03, 2015 1:50:08 PM org.apache.catalina.core.StandardEngine
startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.47
Jun 03, 2015 1:50:12 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
但是当我尝试在端口 8080 的浏览器中显示项目时,我收到以下消息:
Jun 03, 2015 1:50:34 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/gswm-web]
threw exception
[java.lang.LinkageError: loader constraint violation: loader (instance of
org/apache/jasper/servlet/JasperLoader)
previously initiated loading for a different type with name
"javax/servlet/http/HttpServletRequest"]
with root cause
java.lang.LinkageError: loader constraint violation: loader
(instance of org/apache/jasper/servlet/JasperLoader) previously initiated
loading for a different type with name
"javax/servlet/http/HttpServletRequest"
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getDeclaredMethods(Class.java:1962)
at
org.apache.catalina.util.Introspection.getDeclaredMethods
(Introspection.java:127)
at
org.apache.catalina.core.DefaultInstanceManager.populateAnnotationsCache
(DefaultInstanceManager.java:342)
at org.apache.catalina.core.DefaultInstanceManager.newInstance
(DefaultInstanceManager.java:161)
at org.apache.catalina.core.DefaultInstanceManager.newInstance
(DefaultInstanceManager.java:149)
at org.apache.jasper.servlet.JspServletWrapper.getServlet
(JspServletWrapper.java:172)
at org.apache.jasper.servlet.JspServletWrapper.service
(JspServletWrapper.java:369)
at org.apache.jasper.servlet.JspServlet.serviceJspFile
(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service
(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service
(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:210)
at
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke
(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke
(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke
(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process
(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process
(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run
(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
在我尝试过的其他事情中,做了一些研究,我在 pom 中添加了以下几行,但没有成功:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
有人知道如何解决这个问题吗?。非常感谢
对 javax.servlet-api
神器执行相同的操作:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>xxxx</version><!-- Whatever version you are using -->
<scope>provided</scope>
</dependency>
实际上,违规的 class、HttpServletRequest
就在这个神器中。
pom.xml 中的 servlet-api 依赖项需要 "provided" 范围。这是因为 Tomcat 已经提供(需要并使用自身)servlet-api 依赖项。 Maven 的依赖范围规则定义在这里
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>xxxx</version><!-- Whatever version you are using -->
<scope>provided</scope>
</dependency>
我正在按照书本 "Introducing Maven, Apress" 中的说明创建一个简单的 Web 应用程序:HelloWorld!!在 JSP 中。使用 Maven 和 Tomcat7 并使用以下工件:(顺便说一句,我使用的是 win7)
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp
创建的结构如下:
gswm-web
|_pom.xml
|_src
|_main
|_resources
|_webapp
|_WEB-INF
| |_web.xml
|_index.jsp
和 pom.xml 如下所示,添加了 tomcat 插件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.apress.gswmbook</groupId>
<artifactId>gswm-web</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>gswm-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>gswm-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
然后我 运行 从项目根目录中的命令行执行以下命令:
mvn tomcat7:run
我得到以下信息:
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------------------------------------------------
----
[INFO] Building gswm-web Maven Webapp 1.0-SNAPSHOT
[INFO] ---------------------------------------------------------------------
---
[INFO]
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ gswm-web >>>
Downloading: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.pom
Downloaded: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.pom
Downloading: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.jar
Downloaded: http://repo.maven.apache.org/maven2/javax/servlet/jsp/jsp-
api/2.1/jsp-api-2.1.jar
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ gswm-
web ---
[debug] execute contextualize
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered
resources, i.e. build is
platform dependent!
[INFO] skip non existing resourceDirectory
C:\MauricioFiles\Maven\gswm-book-master\gswm-book-
master\chapter6\final\gswm-web\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ gswm-web
---
[INFO] No sources to compile
[INFO]
[INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) @ gswm-web <<<
[INFO]
[INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ gswm-web ---
[INFO] Running war on http://localhost:8080/gswm-web
[INFO] Creating Tomcat server configuration at
C:\MauricioFiles\Maven\gswm-book-master\gswm-book-
master\chapter6\final\gswm-web\target\tomcat
[INFO] create webapp with contextPath: /gswm-web
Jun 03, 2015 1:50:08 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Jun 03, 2015 1:50:08 PM org.apache.catalina.core.StandardService
startInternal
INFO: Starting service Tomcat
Jun 03, 2015 1:50:08 PM org.apache.catalina.core.StandardEngine
startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.47
Jun 03, 2015 1:50:12 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
但是当我尝试在端口 8080 的浏览器中显示项目时,我收到以下消息:
Jun 03, 2015 1:50:34 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/gswm-web]
threw exception
[java.lang.LinkageError: loader constraint violation: loader (instance of
org/apache/jasper/servlet/JasperLoader)
previously initiated loading for a different type with name
"javax/servlet/http/HttpServletRequest"]
with root cause
java.lang.LinkageError: loader constraint violation: loader
(instance of org/apache/jasper/servlet/JasperLoader) previously initiated
loading for a different type with name
"javax/servlet/http/HttpServletRequest"
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getDeclaredMethods(Class.java:1962)
at
org.apache.catalina.util.Introspection.getDeclaredMethods
(Introspection.java:127)
at
org.apache.catalina.core.DefaultInstanceManager.populateAnnotationsCache
(DefaultInstanceManager.java:342)
at org.apache.catalina.core.DefaultInstanceManager.newInstance
(DefaultInstanceManager.java:161)
at org.apache.catalina.core.DefaultInstanceManager.newInstance
(DefaultInstanceManager.java:149)
at org.apache.jasper.servlet.JspServletWrapper.getServlet
(JspServletWrapper.java:172)
at org.apache.jasper.servlet.JspServletWrapper.service
(JspServletWrapper.java:369)
at org.apache.jasper.servlet.JspServlet.serviceJspFile
(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service
(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service
(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:210)
at
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke
(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke
(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke
(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process
(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process
(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run
(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
在我尝试过的其他事情中,做了一些研究,我在 pom 中添加了以下几行,但没有成功:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
有人知道如何解决这个问题吗?。非常感谢
对 javax.servlet-api
神器执行相同的操作:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>xxxx</version><!-- Whatever version you are using -->
<scope>provided</scope>
</dependency>
实际上,违规的 class、HttpServletRequest
就在这个神器中。
pom.xml 中的 servlet-api 依赖项需要 "provided" 范围。这是因为 Tomcat 已经提供(需要并使用自身)servlet-api 依赖项。 Maven 的依赖范围规则定义在这里
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>xxxx</version><!-- Whatever version you are using -->
<scope>provided</scope>
</dependency>