tomcat7-maven-plugin tomcat7:run java.lang.LinkageError zuvor eingeleiteten Belastung für eine andere Art mit dem Namen
Windows Server 2008 R2, 64
Apache-Maven-2.2.1
Java-version: 1.6.0_26
JAVA_HOME: C:\Program Dateien\Java\jdk1.6.0_26
Tomcat 7.0
Kompilieren-Projekt mit Java 1.6
Ich bin versucht, tomcat7-maven-plugin zum ausführen eines tomcat-dev-server mit der tomcat7:run Ziel. Wenn ich versuche zu schlagen den index.jsp für den server, erhalte ich:
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)
Habe ich erfolgreich eingesetzt tomcat7:bereitstellen zum bereitstellen der gleiche code auf einem lokalen tomcat Windows-Dienst-Instanz. Wenn ich auf die lokale Instanz des Servers, keine Fehler.
Mein code hängt davon ab, javax.- servlet.http.HttpServlet über das maven-dependency:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
Angesichts der Fehler, die ich bin immer, ich bin mir ziemlich sicher, dass es ein Klasse laden Konflikt für diese Abhängigkeit. Was ich nicht herausfinden kann, ist das wie/warum/wo der Konflikt; d.h., wo sind die Gläser, die in Konflikt sind, und wie/warum das passiert wenn ich versuche zu laufen, mit tomcat7:run, aber nicht wenn ich "standalone" mit meinem lokalen tomcat-Instanz implementiert werden.
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>
Projekt 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 Erklärung von maven target-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">
eigentlichen 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);
}
}
- Es scheint, Sie haben mehrere Versionen des selben jars (servlet.jar) in den classpath.
- Eine Lösung könnte sein, markieren Sie den Umfang der servlet-bezogenen Gläser, wie
<scope>provided</scope>
diese Weise Tomcat verwendet seine eigene servlet-jars zur Laufzeit
Du musst angemeldet sein, um einen Kommentar abzugeben.
Biju Kunjummen beantwortet die Frage in seinem Kommentar zu meinem ursprünglichen post. Danke Biju Kunjummen! Bitte Stimmen Sie bis sein Kommentar.
Meine Antwort auf meine eigene Frage ist nur die ein bisschen mehr detail.
Die servlet-api-dependency in der pom.xml benötigt die "vorgesehenen" Rahmen. Dies ist, da Tomcat bereits bietet (benötigt und verwendet selbst) die servlet-api-dependency. Maven die Abhängigkeit scoping-Regeln sind hier definiert:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
Korrigiert die servlet-api-dependency xml:
Warum haben die vorherigen xml arbeiten, wenn ich eingesetzt meinen Krieg zu einem lokalen tomcat-Instanz, im Gegensatz zu läuft es auf "in Bearbeitung" (also der, mit dem tomcat7:run Ziel)? Ich weiß jetzt nicht die genaue Antwort für diese. Die maven in-Prozess server-runner ist eindeutig das laden von Abhängigkeiten in einer anderen Weise als in der lokalen tomcat-Instanz implementiert werden.
Mein takeaway von diesem ist, dass, obwohl ich muss eine Abhängigkeit zum kompilieren von code, die ich brauchen, um Bedenken Sie, dass, wenn ich mich bereitstellen, dass der code in eine Art von container, ich brauche für die Verwendung von maven bereitgestellten Umfang, um sicherzustellen, dass die Abhängigkeiten nicht kollidieren.