2014-11-24 70 views
0

我在我的web應用程序的follwing依賴一個罐子時:java.lang.NoClassDefFoundError標記爲提供

<!-- swagger --> 
<dependency> 
    <groupId>com.mangofactory</groupId> 
    <artifactId>swagger-springmvc</artifactId> 
    <version>${version.swagger.springmvc}</version> 
</dependency> 

我想減少戰爭文件的大小,所以我標誌着招搖的水瓶中規定:

<!-- swagger --> 
<dependency> 
    <groupId>com.mangofactory</groupId> 
    <artifactId>swagger-springmvc</artifactId> 
    <version>${version.swagger.springmvc}</version> 
    <scope>provided</scope> 
</dependency> 

我加入了招搖的jar到Tomcat的共同lib文件夾,所以應該被Tomcat運行時提供,但是當我嘗試deply應用程序,我得到這個異常:

java.lang.IllegalStateException: Cannot load configuration class: com.mangofactory.swagger.configuration.DocumentationConfig 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:368) 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:244) 
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) 
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:633) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461) 
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) 
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1279) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1192) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493) 
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:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/classmate/TypeResolver 
at java.lang.Class.getDeclaredMethods0(Native Method) 
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688) 
at java.lang.Class.getDeclaredMethods(Class.java:1962) 
at org.springframework.cglib.core.ReflectUtils.addAllMethods(ReflectUtils.java:348) 
at org.springframework.cglib.proxy.Enhancer.getMethods(Enhancer.java:421) 
at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:456) 
at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) 
at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 
at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317) 
at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:118) 
at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:92) 
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:358) 
... 23 more 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver 
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1718) 
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1569) 
... 36 more 

我注意到問題來自org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses,但我沒有提供的作用域也需要在我的pom中聲明的所有彈簧jar,當 運行webapp時沒有提供的範圍它工作正常任何想法?

回答

0

我認爲這個問題來自另一個缺少的jar。 在棧跟蹤我們看到

Caused by: java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver 

的com.fasterxml.classmate.TypeResolver存在於罐子classmate.jar,這是從招搖-用SpringMVC的依賴性。

當您使用範圍編譯時,也會部署swagger-springmvc的依賴項。 隨着提供的範圍,你必須提供swagger-springmvc jar,但也包括它的所有依賴項。在這裏,你需要提供classmate.jar。

+0

感謝您的快速回答,現在我對編譯和提供的工作有了更好的理解。因爲這一切的目的是通過將大多數commons jar放在一個文件夾中來減少戰爭的規模,我想我別無選擇,只能在tomcat的common lib文件夾中查找並放置所有的swagger依賴項,儘管這是一個不好的做法。 – 2014-11-24 11:40:06

相關問題