Make Tomcat Ignore Servlet in WEB-INF/LIB

来源:互联网 发布:sql sqlserver一样吗 编辑:程序博客网 时间:2024/06/01 13:12


4down votefavorite
2

I'm created a web-application and I need it to be able to interact with a graph database (I'm using Titan). When adding Titan's dependency, I get the following errors when I try to deploy this WAR in Tomcat:

SEVERE: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]    at java.util.concurrent.FutureTask.report(FutureTask.java:122)    at java.util.concurrent.FutureTask.get(FutureTask.java:188)    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)    at java.util.concurrent.FutureTask.run(FutureTask.java:262)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)    at java.lang.Thread.run(Thread.java:744)Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)    ... 6 moreCaused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/servlet/ServletContext"    at java.lang.ClassLoader.defineClass1(Native Method)    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)    at java.security.AccessController.doPrivileged(Native Method)    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1191)    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:173)    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5423)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    ... 6 moreJan 24, 2014 11:43:04 AM org.apache.catalina.core.ContainerBase startInternalSEVERE: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost]]    at java.util.concurrent.FutureTask.report(FutureTask.java:122)    at java.util.concurrent.FutureTask.get(FutureTask.java:188)    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:341)    at org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.startContainer(AbstractRunMojo.java:1238)    at org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.execute(AbstractRunMojo.java:592)    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:606)    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost]]    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)    at java.util.concurrent.FutureTask.run(FutureTask.java:262)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)    at java.lang.Thread.run(Thread.java:744)Caused by: org.apache.catalina.LifecycleException: A child container failed during start    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)    ... 6 more

Some further research has led me to find that Titan is including not one, but two servlet-api-2.5.jar files. I know that Tomcat does not appreciate it when servlet jars are placed in WEB-INF/lib and am assuming that this is the root of the problem. There are two potential solutions to this:

  • Make Titan to use the servlet jar within Tomcat

  • Tell Tomcat to ignore the servlet jar in WEB-INF/lib.


 
解决如下:

12down voteaccepted

Declare servlet as provided

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

or

<dependency>    <groupId>org.mortbay.jetty</groupId>     <artifactId>servlet-api</artifactId>     <version>2.5-20081211</version>    <scope>provided</scope></dependency>

and exclude servlet from titan

<dependency>   <groupId>titan</groupId>   <artifactId>titan</artifactId>   <exclusions>      <exclude>         <groupId>javax.servlet</groupId>         <artifactId>servlet-api</artifactId>      </exclude>   </exclusions></dependency>
0 0