java.lang.Ошибка проверки при запуске приложения Spring boot с использованием tomcat

#java #spring-boot #java-8 #jvm #tomcat8

#java #spring-boot #java-8 #jvm #tomcat8

Вопрос:

 ERROR [org.springframework.web.context.ContextLoader:313] - Context initialization failed
java.lang.VerifyError: (class: org/springframework/core/type/StandardAnnotationMetadata, method: getAnnotationTypes signature: ()Ljava/util/Set;) Illegal type in constant pool
    at org.springframework.core.type.AnnotationMetadata.introspect(AnnotationMetadata.java:127)
    at org.springframework.context.annotation.ConfigurationClassUtils.dt_133_checkConfigurationClassCandidate_98(ConfigurationClassUtils.java)
    at org.springframework.context.annotation.ConfigurationClassUtils.checkConfigurationClassCandidate(ConfigurationClassUtils.java:108)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:276)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4792)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5256)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:629)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1839)
    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:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
  

Это происходит в одной из сред развертывания, тогда как на другой виртуальной машине она работает нормально.
Обе виртуальные машины имеют одинаковые версии JDK, tomcat и spring.

Я не могу найти какую-либо причину, почему это происходит. В чем может быть проблема?

Комментарии:

1. это интересно. он жалуется на то, что ожидаемый возвращаемый тип StandardAnnotationMetadata::getAnnotationType , который является java.util.Set , недопустим в постоянном пуле файла класса. Кажется, что какой-то код изменяет байт-код и портит записи постоянного пула.

2. Я думал, что переустановка JDK может исправить это, но я все еще вижу ту же проблему. Я могу установить это в любой другой среде, но это виртуальная машина PROD, поэтому я даже не могу выполнить RCA.

Ответ №1:

Итак, в моем случае виновником был Dynatrace . Во время выполнения Dynatrace выполняет некоторые инструменты в файлах классов для мониторинга производительности, которые изменяют байт-код класса Java. Теперь, если версия dynatrace несовместима с установленной runtime JDK , мы можем столкнуться с такими проблемами, как:

 warning [native] Error during parsing of java bytecode: Java classes with "invokedynamic" are not supported, skipping class transformation (class java/time/Instant) 
  

или

 ERROR [org.springframework.web.context.ContextLoader:313] - Context initialization failed
java.lang.VerifyError: (class: org/springframework/core/type/StandardAnnotationMetadata, method: getAnnotationTypes signature: ()Ljava/util/Set;) Illegal type in constant pool
    at 
  

После отключения Dynatrace и переустановки app amp; JDK все работало нормально. Это одна из проблем, которые могут наблюдаться в таких сценариях.