tomcat7-maven-plugin tomcat7:exécution de java.lang.LinkageError déjà lancé de chargement pour un autre type de nom
Windows Server 2008 R2 64
Apache Maven 2.2.1
Java version: 1.6.0_26
JAVA_HOME: C:\Program Files\Java\jdk1.6.0_26
Tomcat 7.0
La compilation du projet avec la version 1.6 de Java
Je suis en train d'utiliser tomcat7-maven-plugin pour exécuter un tomcat serveur de dev à l'aide de la tomcat7:course objectif. Quand j'ai essayer de frapper l'index.jsp pour le serveur, je reçois:
HTTP Status 500 - 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"
type Exception report
message 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"
description The server encountered an internal error (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") that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: 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"
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:343)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
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"
java.lang.Class.getDeclaredMethods0(Native Method)
java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
java.lang.Class.getDeclaredMethods(Class.java:1791)
org.apache.catalina.util.Introspection.getDeclaredMethods(Introspection.java:108)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
J'ai utilisé avec succès tomcat7:déployer pour déployer le même code pour un local tomcat Windows instance de service. Lorsque j'accède à l'instance locale du serveur, pas d'erreurs.
Mon code dépend javax.servlet.http.HttpServlet via ce maven dependency:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
Compte tenu de l'erreur que je reçois, je suis assez sûr qu'il y a un chargement de classe conflit de cette dépendance. Ce que je n'arrive pas à comprendre qui est le comment/pourquoi/où du conflit; c'est à dire, où sont les pots qui sont en conflit, et comment/pourquoi est-ce qui se passe lorsque j'essaie d'exécuter avec tomcat7:courir, mais pas quand je lance "autonome" à l'aide de mon local instance de tomcat.
pom:
<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.moring.gloak</groupId>
<artifactId>gloak-registration</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>gloak-registration Maven Webapp</name>
<build>
<finalName>gloak-registration</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0-SNAPSHOT</version>
<configuration>
<server>local_tomcat</server>
<url>http://localhost:9280/manager/text</url>
<update>true</update>
<port>9280</port>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>people.apache.snapshots</id>
<url>http://repository.apache.org/content/groups/snapshots-group/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</project>
projet web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>registrationServlet</servlet-name>
<servlet-class>com.moring.gloak.web.register.RegistrationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>registrationServlet</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
</web-app>
tomcat web.xml webapp déclaration de maven cible dir:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
réelle servlet code:
package com.moring.gloak.web.register;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public final class RegistrationServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("index.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> messages = new HashMap<String, String>();
request.setAttribute("messages", messages);
//Get and validate name.
String serviceName = request.getParameter("serviceName");
if (serviceName == null || serviceName.trim().isEmpty()) {
messages.put("name", "Please enter service name");
} else if (!serviceName.matches("\\p{Alnum}+")) {
messages.put("name", "Please enter alphanumeric characters only");
}
if (messages.isEmpty()) {
messages.put("success", String.format("Service name is %s", serviceName));
}
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
Une résolution peut être pour marquer le champ d'application de la servlet liées bocaux fourni
<scope>provided</scope>
, de cette façon, Tomcat utilise son propre servlet pots au moment de l'exécution
OriginalL'auteur Hawkeye Parker | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Biju Kunjummen répondu à la question dans son commentaire à mon post original. Merci Biju Kunjummen! S'il vous plaît voter jusqu'à son commentaire.
Ma réponse à ma propre question est seulement de fournir un peu plus de détails.
Le servlet-api dépendance dans le pom.xml besoin de la "condition" de la portée. C'est parce que Tomcat fournit déjà (nécessite lui-même) de la servlet-api de dépendance. Maven dépendance de l'établissement de la portée des règles sont définies ici:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
Le corrigé servlet-api dépendance xml:
Pourquoi le précédent xml travail quand j'ai déployé ma guerre à un tomcat exemple, par opposition à exécution "dans le processus" (c'est à dire, avec la tomcat7:exécution de l'objectif)? Je n'ai pas de réponse exacte à cette. Le maven dans le processus de serveur de coureur est clairement le chargement des dépendances d'une manière différente que l'instance de tomcat.
Mon résumé, c'est que même si j'ai peut-être besoin d'une dépendance à la compilation du code, j'ai besoin de garder à l'esprit que, si je suis le déploiement de ce code dans une sorte de récipient, j'ai besoin d'utiliser maven est permis pour s'assurer que les dépendances ne pas entrer en collision.
OriginalL'auteur Hawkeye Parker