ValidateJarFile(D:\path\) - jar 未加载。请参阅 Servlet 规范 3.0,第 10.7.2 节。冒犯class:javax/servlet/Servlet.class

ValidateJarFile(D:\path\) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class

这个问题在这里被问了很多次,但由于我对使用 tomcat 7 和 Eclipse IDE for J2EE Dev 以及 Gradle 作为构建工具知之甚少,我无法充分利用成员提供的帮助。于是,这个问题。

IDE:

         Eclipse Java EE IDE for Web Developers.  
         Version: Luna Service Release 1 (4.4.1)

构建工具 Gradle 1.3

服务器tomcat 7 - configured in Eclipse

错误跟踪:

Mar 05, 2015 9:49:36 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:com.expedia.globalpayments.incentiverecon' did not find a matching property.
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/7.0.57
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Nov 3 2014 08:39:16 UTC
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         7.0.57.0
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Windows 7
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            6.1
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JAVA_HOME:             C:\Expedia\Java\jdk1.7.0_71\jre
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.7.0_71-b14
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         D:\Office\project\workspace_2015_april\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         D:\Office\tomcat\tomcat-7
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=D:\Office\project\workspace_2015_april\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=D:\Office\tomcat\tomcat-7
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=D:\Office\project\workspace_2015_april\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=D:\Office\tomcat\tomcat-7\endorsed
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Denvironment.properties.location=D:\Office\incentiverecon\irEnvironmentProperties\environment.properties
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dir.log.dir=D:\Office\incentiverecon\irlogs
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=Cp1252
Mar 05, 2015 9:49:36 AM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Expedia\Java\jdk1.7.0_71\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMD APP\bin\x86;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\Intel\OpenCL SDK.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK.0\bin\x64;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Expedia\Java\jdk1.7.0_71\bin;C:\gradle\gradle-1.3\bin;C:\Expedia\SQLServer(x86)0\Tools\Binn\VSShell\Common7\IDE\;C:\Expedia\SQLServer(x86)0\Tools\Binn\;C:\Expedia\SQLServerShared0\Tools\Binn\;C:\Expedia\SQLServer(x86)0\DTS\Binn\;C:\Expedia\SQLServerShared0\DTS\Binn\;C:\Program Files (x86)\Git\cmd;C:\Program Files\MongoDB 2.6 Standard\bin;C:\Expedia\KDiff3;.
Mar 05, 2015 9:49:36 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Mar 05, 2015 9:49:36 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Mar 05, 2015 9:49:36 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 378 ms
Mar 05, 2015 9:49:36 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Mar 05, 2015 9:49:36 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.57
Mar 05, 2015 9:49:36 AM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [249] milliseconds.
Mar 05, 2015 9:49:37 AM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(D:\Office\project\workspace_2015_april\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\com.expedia.globalpayments.incentiverecon\WEB-INF\lib\javax.servlet-2.3.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
Mar 05, 2015 9:49:40 AM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags is already defined
Mar 05, 2015 9:49:40 AM org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: http://www.springframework.org/tags/form is already defined
Mar 05, 2015 9:49:40 AM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
Mar 05, 2015 9:49:40 AM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Mar 05, 2015 9:49:41 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\Office\project\workspace_2015_april\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\com.expedia.globalpayments.incentiverecon\WEB-INF\classes\com\expedia\globalpayments\ir\checker\HealthCheckFilter.class]; nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:301)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
    at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:85)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1424)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1414)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:187)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:141)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:110)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    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:745)
Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:63)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:82)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:277)
    ... 32 more

Mar 05, 2015 9:49:41 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
Mar 05, 2015 9:49:41 AM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/com.expedia.globalpayments.incentiverecon] startup failed due to previous errors
Mar 05, 2015 9:49:41 AM org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
Mar 05, 2015 9:49:41 AM org.apache.catalina.core.StandardContext listenerStop
SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
    at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170)
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:921)
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:841)
    at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:579)
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:115)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5035)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5687)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    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:745)

Mar 05, 2015 9:49:41 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/com.expedia.globalpayments.incentiverecon] appears to have started a thread named [AsyncAppender-Dispatcher-Thread-1] but has failed to stop it. This is very likely to create a memory leak.
Mar 05, 2015 9:49:41 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/com.expedia.globalpayments.incentiverecon] appears to have started a thread named [AsyncAppender-Dispatcher-Thread-2] but has failed to stop it. This is very likely to create a memory leak.
Mar 05, 2015 9:49:41 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Mar 05, 2015 9:49:41 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Mar 05, 2015 9:49:41 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 4906 ms

您不应该包含带有 javax.servlet.Servlet 的 JAR,因为它是由 Tomcat 提供的。有关如何将依赖项标记为已提供的详细信息,请参阅 this question。方便的是,评分最高的答案提供了一个与 Servlet API.

相关的示例

Tomcat 足够聪明,不会加载此 JAR 而是记录警告,因此特定消息不是导致 startup/deployment 失败的原因。

虽然您应该解决警告,但 IncompatibleClassChangeError 是您的主要问题。这很可能是由于在同一项目中混用了不同版本的 Spring。例如,一些来自 Spring 3.1 的 JAR 和其他来自 3.2 的 JAR。尝试 运行 gradle dependencies 并检查所有 Spring JAR 是否来自同一版本。