当前位置: 首页 > 知识库问答 >
问题:

tomcat7-maven-plugin tomcat7:运行java.lang.LinkageError先前启动的加载不同类型的名称

曾喜
2023-03-14

Windows Server 2008 R2,64 Apache Maven 2.2.1 Java版本:1.6.0\u 26 Java\u主页:C:\Program Files\Java\jdk1.6.0\u 26 Tomcat 7.0使用Java 1.6编译项目

我正在尝试使用tomcat7 maven插件来运行一个使用tomcat7:run目标的tomcat开发服务器。当我尝试点击索引时。服务器的jsp,我收到:

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)

我已经成功地使用tomcat7:deploy将相同的代码部署到本地tomcat Windows服务实例。当我访问服务器的本地实例时,没有错误。

我的代码依赖于javax。servlet。http。通过此maven依赖关系的HttpServlet:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>

鉴于我得到的错误,我很确定此依赖项存在类加载冲突。我无法弄清楚冲突的方式/原因/位置;即,冲突的jar在哪里,以及当我尝试使用tomcat7: run运行时如何/为什么会发生这种情况,但当我使用本地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>

项目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。maven目标目录中的xml webapp声明:

<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">

实际servlet代码:

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);
    }
}

共有2个答案

潘胤
2023-03-14

对我来说,它就像。

         <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

只需在依赖项中添加作用域

汲品
2023-03-14

比州昆琼门在他对我原始帖子的评论中回答了这个问题。谢谢比州昆琼门!请投票支持他的评论。

我对自己问题的回答只是提供了更多的细节。

pom中的servlet api依赖关系。xml需要“提供的”范围。这是因为Tomcat已经提供(需要并使用自己)servlet api依赖关系。Maven的依赖关系范围规则定义如下:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

更正的servlet api依赖关系xml:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

为什么以前的xml在我将war部署到本地tomcat实例时起作用,而不是“在过程中”运行它(即使用tomcat7:运行目标)?我没有确切的答案。maven in-process server runner显然以与本地tomcat实例不同的方式加载依赖项。

我的收获是,尽管我可能需要依赖项来编译一些代码,但我需要记住,如果我要将代码部署到某种容器中,我需要使用maven提供的作用域来确保依赖项不会发生冲突。

 类似资料:
  • 问题内容: 我的JSystem / Java / Eclipse环境有问题。 我收到此错误,但我不明白这是什么错误: 我想知道是否有人遇到过类似的问题,我认为我的环境对于解决它不是很重要,如果我能理解“ undergound”发生的事情,我希望自己解决问题。 非常感谢。 问题答案: 我认为这是当我两次加入图书馆时发生的。

  • 问题内容: 是否可以在Java中加载类并“伪造”类的包名称/规范名称?我尝试这样做,这很明显,但是我在中收到“类名不匹配”的消息。 我这样做的原因是我试图加载在默认程序包中编写的API,以便我可以直接使用它而无需使用反射。该代码将在表示包和包名称导入的文件夹结构中针对该类进行编译。即: 我当前的代码如下: 问题答案: 如Pete所述,可以使用ASM字节码库来完成此操作。实际上,该库实际上带有一个专

  • 我正在使用composer在我的项目中包含一个私有包,其中包含一些我将使用PHPUnit进行测试的类。包的大部分被正确地自动加载,我可以从单元测试中调用类,但是任何与它所在的目录命名相同的类都会抛出“未找到类”错误。 存储库符合psr-0,位于https://github.com/DeschutesDesignGroupLLC/IPS-Source 文件结构示例投掷错误: 调用

  • 问:如何运行一个安装文件 .reg 答:注:your.reg为文件名 ExecWait "regedit.exe /s your.reg" 问:如何运行一个安装文件 .inf 答:注:skins.inf 为文件名 ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall" 问:如何运行一个安装文件 .msi 答

  • 每当我在tomcat中部署Web应用程序时,WEB-INF/lib中的所有jar都将加载到应用程序ClassLoader中。 我很少有其他位置有一些jars集,例如WEB-INF/ChildApp1/*. jar、WEB-INF/ChildApp2/*. jar......根据用户请求,我想将一些jars集加载到当前的类加载器中。 注意:我不想创建任何子类装入器。 我真正的要求是,如何以编程方式将

  • 问题内容: 我今天在另一个问题中提出了这个问题,但是 由于措辞的方式,恐怕无法解决任何问题。 我有一个json输入,其中包含以下数据: 杰森 如您所见,option_value项是一个对象中的Array和 另一个对象中的简单字符串。 我怎样才能让Gson正确处理呢?我的类将此描述为 List对象,因此它适用于option_value是 数组的前几个项目,但是当它成为字符串时,应用程序崩溃,并且我收