javaspringspring-bootmaventomcat

Issue in spring-boot war startup in external tomcat due to unwanted spring jar


I am trying to run an spring-boot web application war file in external tomcat where many other applications (Spring and not spring-boot) are already running. There are some dependencies at some shared location on same server which is loaded into application at runtime which is configured in catalina.properties file common.loader

While staring my spring-boot application I am getting below error:

        java.lang.IllegalStateException: Error starting child
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:661)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1023)
                at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1910)
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
                at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:824)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1617)
                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:318)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114)
                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:794)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:248)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:921)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myservice]]
                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:419)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:186)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
                ... 37 more
        Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.NoSuchMethodException-->org.springframework.ws.config.annotation.DelegatingWsConfiguration$$EnhancerBySpringCGLIB$$47de5974.CGLIB$SET_THREAD_CALLBACKS([Lorg.springframework.cglib.proxy.Callback;)
                at org.springframework.cglib.proxy.Enhancer$EnhancerFactoryData.<init>(Enhancer.java:513)
                at org.springframework.cglib.proxy.Enhancer.wrapCachedClass(Enhancer.java:806)
                at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:111)
                at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:108)
                at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
                at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
                at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134)
                at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)
                at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572)
                at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:419)
                at org.springframework.context.annotation.ConfigurationClassEnhancer.createClass(ConfigurationClassEnhancer.java:137)
                at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:109)
                at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:447)
                at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:268)
                at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:325)
                at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:147)
                at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748)
                at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
                at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
                at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731)
                at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
                at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:175)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:155)
                at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:97)
                at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:174)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4904)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                ... 38 more
        Caused by: java.lang.NoSuchMethodException: org.springframework.ws.config.annotation.DelegatingWsConfiguration$$EnhancerBySpringCGLIB$$47de5974.CGLIB$SET_THREAD_CALLBACKS([Lorg.springframework.cglib.proxy.Callback;)
                at java.lang.Class.getDeclaredMethod(Class.java:2130)
                at org.springframework.cglib.proxy.Enhancer.getCallbacksSetter(Enhancer.java:912)
                at org.springframework.cglib.proxy.Enhancer.access$000(Enhancer.java:93)
                at org.springframework.cglib.proxy.Enhancer$EnhancerFactoryData.<init>(Enhancer.java:502)
                ... 67 more

After some investigation I found that this error is coming because of spring-ws-core jar while is coming from shared location. In my application this jar is never included or required. If I remove this jar from shared location then I am not getting this error but other applications require this jar so I can't remove this from shared location.

Is there any way to not load some of shared location specific jars for this particular application.

Any help is appreciated!


Solution

  • For anyone who is facing similar issue, I was able to resolve this issue by adding dependency for the jars which was causing issue (Like spring-ws-core and some jackson jars in my case) in project pom file without specifying any version like below.

    <dependency>
        <groupId>org.springframework.ws</groupId>
        <artifactId>spring-ws-core</artifactId>
    </dependency>
    

    This way, required jars of correct version was downloaded in WEB-INF/lib of my project and it was not referring to shared library jar files (Defined through catalina.properties common.loader). I am still not sure why these dependencies were required in my project because it was running fine on my local tomcat without that.