首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

maven项目生成的war包在tomcat下运行报错(1)

maven项目生成的war包在tomcat下运行报错(1)

maven项目在tomcat中运行 主要会有两种错误:

一是依赖包冲突

二是slf4j包错误


如下:

    信息: Deploying web application archive D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT.war
    2014-11-18 17:17:01 org.apache.catalina.loader.WebappClassLoader validateJarFile
    信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet-3.0.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    2014-11-18 17:17:01 org.apache.catalina.loader.WebappClassLoader validateJarFile
    信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet.jsp-3.0.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
    2014-11-18 17:17:01 org.apache.catalina.loader.WebappClassLoader validateJarFile
    信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\jsp-api-2.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/el/Expression.class
    2014-11-18 17:17:01 org.apache.catalina.loader.WebappClassLoader validateJarFile
    信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\servlet-api-2.3.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    2014-11-18 17:17:01 org.apache.catalina.loader.WebappClassLoader validateJarFile
    信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    2014-11-18 17:17:01 org.apache.catalina.loader.WebappClassLoader validateJarFile
    信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\tomcat-servlet-api-8.0.15.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class


    严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
        at org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:159)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:272)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:976)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1653)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)




我们来分析原因和尝试解决:
依赖包冲突
原因

在Maven1中,需要把依赖所需要的包每个列出。这对于使用类似如Hibernate的用户来说所操的心太多了,而且也不方便。在Maven2及以上版本中实现了传递依赖,如此对于Hibernate所依赖的包,Maven2会自动下载,开发人员只需关心Hibernate即可。所以可以看出列出所需要的每个jar是在maven1中的功能,Maven2以上版本认为自动下载是一种改进。

       这样就产生了一个问题:Maven2以上版本虽然把编译时需要的jar都下载了,但并不是所有编译需要的jar在打成war包后运行时也需要。所以也就发现有许多的jar是不需要的,以至war包比较大。还会产生冲突。

       类包冲突的一个很大的原因即产类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,严重的甚至会引起类包之间的冲突。


例如:

servlet-api.jar

信息: validateJarFile(D:\tomcat7\webapps\ipFilterM-0.0.1-SNAPSHOT\WEB-INF\lib\servlet-api-2.3.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

造成这种情况的原因很可能是以下两种情况:

一、项目的WEB-INF/lib下有servlet-api.jar,与Tomcat自带的servlet-api.jar冲突了。

二、项目的WEB-INF/lib下有包含javax.servlet包的其他JAR包(如WebLogic 8.1的weblogic.jar),造成与Tomcat自带的servlet-api.jar的冲突。



因为Tomcat的WebappClassLoader加载JAR包时会进行校验,一旦发现上述冲突就会报出上面的异常。


解决方法
直接引用的包
要加上<scope>provided</scope>标签

maven的dependency中有一个tag是<scope>option</scope>,其option有以下几个值:

  compile, 缺省值,适用于所有阶段,会随着项目一起发布。

  provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet-api-2.3.jar。

  runtime, 在运行时使用,如JDBC驱动,适用运行和测试阶段。   如plexus-utils-1.1.jar

  test     只在测试时使用,用于编译和运行测试代码。不会随项目发布。如Junit-3.8.1.jar

  system, 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

例如:

javax.servlet-3.0.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class


    <dependency>
                <groupId>org.glassfish</groupId>
                <artifactId>javax.servlet</artifactId>
                <version>3.0.1</version>            
            </dependency>



在pom.xml中是直接引用的,则改为:

    <dependency>
                <groupId>org.glassfish</groupId>
                <artifactId>javax.servlet</artifactId>
                <version>3.0.1</version>
                <scope>provided</scope>
            </dependency>




间接引用包
间接冲突解决方法一新建一个provided冲突包
新建一个冲突包,加上<scope>provided</scope>标签
例如:servlet-api-2.3.jar
在pom.xml中没有它的信息,是其它包间接引用了它
则我们新建如下:

        <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.3</version>
                <scope>provided</scope>
            </dependency>
返回列表