title: Class not found exception in Spring boot application deployment to external tomcat
body: <p>I have recently upgraded spring boot application from 1.3.1 to 1.5.10 version and Gradle from 2.7 to 3.5. I have fixed all the errors regarding upgrade and is working fine with IDE (STS). But when I am trying to deploy the war to external tomcat getting <strong>java.lang.NoClassDefFoundError: org/junit/rules/TestRule</strong>. </p>
  
  <p>The application was working fine with old configuration only updated spring boot and Gradle version.</p>
  
  <pre><code>
  [ERROR] org.springframework.boot.SpringApplication - Application startup failed
  org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.projectx.SpringIntegrationApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class com.projectx.SpringIntegrationApplication
      at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
      at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
      at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
      at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:272)
      at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:92)
      at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)
      at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
      at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:154)
      at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:134)
      at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87)
      at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
      at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952)
      at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
  Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class com.projectx.SpringIntegrationApplication
      at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163)
      at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:380)
      at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314)
      at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
      at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
      at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
      ... 26 common frames omitted
  Caused by: java.lang.NoClassDefFoundError: org/junit/rules/TestRule
      at java.lang.ClassLoader.defineClass1(Native Method)
      at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
      at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2270)
      at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:811)
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1254)
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
      at java.lang.Class.getDeclaredMethods0(Native Method)
      at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
      at java.lang.Class.getDeclaredMethods(Class.java:1975)
      at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152)
      ... 31 common frames omitted
  Caused by: java.lang.ClassNotFoundException: org.junit.rules.TestRule
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
      ... 42 common frames omitted
  22-Jan-2020 12:35:33.963 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
   org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
      at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952)
      at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
  Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.projectx.SpringIntegrationApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class com.projectx.SpringIntegrationApplication
      at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
      at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
      at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
      at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:272)
      at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:92)
      at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)
      at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
      at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:154)
      at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:134)
      at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87)
      at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      ... 10 more
  Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class com.projectx.SpringIntegrationApplication
      at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163)
      at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:380)
      at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314)
      at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
      at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
      at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
      ... 26 more
  Caused by: java.lang.NoClassDefFoundError: org/junit/rules/TestRule
      at java.lang.ClassLoader.defineClass1(Native Method)
      at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
      at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2270)
      at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:811)
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1254)
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
      at java.lang.Class.getDeclaredMethods0(Native Method)
      at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
      at java.lang.Class.getDeclaredMethods(Class.java:1975)
      at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152)
      ... 31 more
  Caused by: java.lang.ClassNotFoundException: org.junit.rules.TestRule
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
      at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
      ... 42 more
  
  22-Jan-2020 12:35:33.965 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive /usr/local/apache-tomcat-8.5.5/webapps/ROOT.war
   java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:728)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
      at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:952)
      at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1823)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
  </code></pre>
  
  <p>Gradle </p>
  
  <pre><code>buildscript {
      ext {
       //   springBootVersion = '1.3.0.RELEASE'
       springBootVersion = '1.5.10.RELEASE'
       googleAPIClientVersion='1.2.3-alpha'
       googleAPIClientJacksonVersion='1.23.0'     
      }
      repositories {
          jcenter()
          mavenLocal()
          mavenCentral()
      }
      dependencies {
          classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
          classpath ('org.asciidoctor:asciidoctor-gradle-plugin:1.5.2')
          //classpath('io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE')
      }
  }
  
  apply plugin: 'java'
  apply plugin: 'eclipse'
  apply plugin: 'idea'
  apply plugin: 'org.springframework.boot' 
  //apply plugin: 'io.spring.dependency-management' 
  apply plugin: 'war'
  apply plugin: 'org.asciidoctor.convert'
  
  
  war {
      baseName = 'ROOT'
  
  }
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
  
  repositories {
      mavenLocal()
      mavenCentral()
  }
  
  configurations {
      providedRuntime
  }
  
  dependencies {
      compile('org.springframework.boot:spring-boot-starter-integration')
      compile('org.springframework.boot:spring-boot-starter-web')
      compile("org.springframework.boot:spring-boot-starter-thymeleaf")
      compile('org.springframework.integration:spring-integration-twitter:4.0.0.RELEASE')
      compile('org.springframework.integration:spring-integration-java-dsl:1.0.0.RELEASE')        
      compile("org.springframework.boot:spring-boot-starter-data-mongodb")
      compile("org.springframework.boot:spring-boot-starter-data-jpa")
      compile('org.springframework.boot:spring-boot-starter-security')
      compile("mysql:mysql-connector-java:5.1.6")
      compile('com.google.code.gson:gson:2.3')
      compile('javax.interceptor:javax.interceptor-api:1.2')
      compile('com.sun.mail:javax.mail:1.5.5')
      compile('com.itextpdf:itextpdf:5.4.5')
      compile('com.itextpdf.tool:xmlworker:5.5.6')
  
      //excel sheet
      compile ('org.apache.commons:commons-lang3:3.6')
      compile ('org.dstadler:commons-dost:1.0.0.23')
      compile ('com.google.guava:guava:21.0')
      compile ('org.apache.commons:commons-csv:1.5')
      compile 'org.apache.poi:poi:3.17'
      compile 'org.apache.poi:poi-ooxml:3.17'
      compile 'org.apache.poi:poi-scratchpad:3.17'
  
      testCompile("com.jayway.jsonpath:json-path:1.1.0")           
     // testCompile('org.springframework.boot:spring-boot-starter-test')
  //    testCompile("org.mockito:mockito-core:1.+")     
      providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")  
      compile("org.springframework.restdocs:spring-restdocs-mockmvc:1.1.1.RELEASE")
      //compile('com.amazonaws:aws-java-sdk-s3:1.10.75')
  
      //Deploy on same tomcat with diffrent domain dependancy
      compile group: 'org.springframework.integration', name: 'spring-integration-jmx', version: '4.3.0.RELEASE' 
  
      //JJWT
      compile ('io.jsonwebtoken:jjwt:0.6.0')
      compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.4'
  
      //AWS S3 SDK
      compile group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.11.86'
      //AWS SES SDK
      compile group: 'com.amazonaws', name: 'aws-java-sdk-ses', version: '1.11.86'    
      //AWS SSM SDK
      compile group: 'com.amazonaws', name: 'aws-java-sdk-ssm', version: '1.11.665'
      //AWS EC2
      compile group: 'com.amazonaws', name: 'aws-java-sdk-ec2', version: '1.11.665'
  
      //SafetyNet
      //compile group: 'com.google.api.client', name: 'google-api-client-json', version: googleAPIClientVersion
      compile group: 'com.google.http-client', name: 'google-http-client-jackson2', version: googleAPIClientJacksonVersion
  
          // https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
      compile group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '1.9'
  
      //Firebase    
      compile group: 'com.google.firebase', name: 'firebase-admin', version: '5.2.0'
  
      // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator 
      compile('org.springframework.boot:spring-boot-starter-actuator')
  
      compile('com.google.maps:google-maps-services:0.9.1')
  
      // https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-ip
      compile group: 'org.springframework.integration', name: 'spring-integration-ip', version: '4.3.0.RELEASE'
  
      compile('org.flywaydb:flyway-core') 
  
      //mysql connection pooling
      compile group: 'com.zaxxer', name: 'HikariCP', version: '2.4.6'
  }
  
  
  eclipse {
      classpath {
           containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
           containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
      }
  }
  
  task wrapper(type: Wrapper) {
      gradleVersion = '3.5'
  }
  
  ext {
      snippetsDir = file('build/generated-snippets')
  }
  
  test {
      outputs.dir snippetsDir
  }
  
  asciidoctor {
      attributes 'snippets': snippetsDir
      inputs.dir snippetsDir
      dependsOn test
  }
  
  </code></pre>
  
  <p>Guide me to diagnose this issue. Also want to know why tomcat loading junit class at run time.</p>
  
  <p>Your suggestions will be highly appreciable. </p>