【问题标题】:java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader)java.lang.LinkageError:加载程序约束违规:加载程序(org/apache/catalina/loader/WebappClassLoader 的实例)
【发布时间】:2016-09-28 07:13:46
【问题描述】:

无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/projectname]]

原因:java.lang.LinkageError:加载程序约束违规:加载程序(org/apache/catalina/loader/WebappClassLoader 的实例)先前为名为“javax/servlet/ServletContext”的不同类型启动加载

org.apache.catalina.LifecycleException: 无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost]]

在打印堆栈跟踪中也没有给出任何ClassNotFoundException :HttpServletRequest

我在pom.xml文件中添加了tomcat maven插件。我想运行一些集成测试,所以我添加了插件以在集成开始之前运行。这是我的插件

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <port>8989</port>
        <systemProperties>
            <archaius.deployment.environment>test</archaius.deployment.environment>
        </systemProperties>
        <path>/${project.name}</path>
    </configuration>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>run</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
                <systemProperties>
                    <!-- We want test configuration for running integration tests. -->
                    <archaius.deployment.environment>test</archaius.deployment.environment>
                    <logback-lib.env>filesystem</logback-lib.env>
                </systemProperties>
                <fork>true</fork>
            </configuration>
        </execution>
        <execution>
            <id>tomcat-shutdown</id>
            <goals>
                <goal>shutdown</goal>
            </goals>
            <phase>post-integration-test</phase>
        </execution>
    </executions>
</plugin>

这个插件是我在pom.xml文件中添加的。

我还添加了servlet dependency,并仅提供provided 的范围。

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

当我执行mvn clean install 时,它会给出以下异常

严重:子容器在启动期间失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/projectpath]] 在 java.util.concurrent.FutureTask.report(FutureTask.java:122) 在 java.util.concurrent.FutureTask.get(FutureTask.java:192) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) 在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因:org.apache.catalina.LifecycleException:无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/projectpath]] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) ... 6 更多 原因:java.lang.LinkageError:加载程序约束违规:加载程序(org/apache/catalina/loader/WebappClassLoader 的实例)先前为名为“javax/servlet/ServletContext”的不同类型启动加载 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:763) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:73) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:368) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:362) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:361) 在 org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1191) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) 在 java.lang.Class.getDeclaredMethods0(本机方法) 在 java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 在 java.lang.Class.getDeclaredMethods(Class.java:1975) 在 org.apache.catalina.util.Introspection.getDeclaredMethods(Introspection.java:127) 在 org.apache.catalina.startup.WebAnnotationSet.loadMethodsAnnotation(WebAnnotationSet.java:281) 在 org.apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.java:113) 在 org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:66) 在 org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:405) 在 org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881) 在 org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376) 在 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 在 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 更多

2016 年 9 月 28 日下午 12:29:26 org.apache.catalina.core.ContainerBase startInternal 严重:子容器在启动期间失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost]] 在 java.util.concurrent.FutureTask.report(FutureTask.java:122) 在 java.util.concurrent.FutureTask.get(FutureTask.java:192) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) 在 org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.startup.Tomcat.start(Tomcat.java:341) 在 org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.startContainer(AbstractRunMojo.java:1238) 在 org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.execute(AbstractRunMojo.java:592) 在 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207) 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) 在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) 在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) 在 org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) 在 org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) 在 org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) 在 org.apache.maven.cli.MavenCli.execute(MavenCli.java:863) 在 org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288) 在 org.apache.maven.cli.MavenCli.main(MavenCli.java:199) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 在 org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 在 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 原因:org.apache.catalina.LifecycleException:无法启动组件 [StandardEngine[Tomcat].StandardHost[localhost]] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因:org.apache.catalina.LifecycleException:子容器在启动期间失败 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) 在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 更多

【问题讨论】:

  • 但是stack trace中没有java.lang.ClassNotFoundException: HttpServletRequest,我也加了servlet依赖,怎么是CLassNotFoundException?
  • 对我来说,这听起来像是与您的 servlet-api 和 tomcat 提供的 servlet-api 冲突。你的容器 tomcat 7 或 8 是什么?尝试 8 与您的 servlet-api 3.1 并将项目方面动态 web 模块设置为 3.1。或者尝试使用tomcat 7.0.72和facet 3.0降级到3.0.1。而且重复问题的标题是错误的,他问题的根本原因和你一样。我假设如果你评论“tomcat7-maven-plugin”它会起作用吗?
  • 外部我没有使用任何tomcat服务器,这里我使用的是pom.xml文件中的tomcat7插件。
  • 我支持你,用你的环境编辑你的问题,我想这会有所帮助。

标签: java maven tomcat integration-testing maven-plugin


【解决方案1】:

我解决了这个问题, 实际上 javax.servlet 在内部被其他依赖项 http-libcommons-util 所涉及。

我用过

<exclusions>
    <exclusion>
         <artifactId>servlet-api</artifactId>
        <groupId>javax.servlet</groupId>
    </exclusion>
</exclusions>

在这两个依赖项中。然后问题就解决了

【讨论】:

  • 我遇到了同样的问题,但使用另一个库并通过排除它来解决它;)谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2021-06-29
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多