ClassFormatError: повторяющееся имя метода и подпись от EnhancerBySpringCGLIB

Я действительно озадачен здесь. Я обновил наши библиотеки Spring с 4.0.6 до 4.3.2. Один из наших тестов не прошел при работе с 4.3.2. Это код, о котором идет речь:

@Bean(name = SCHEDULER_FACTORY)
public SchedulerFactoryBean getSchedulerFactory()
{
    SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
    schedulerFactory.setConfigLocation(schedulerConfig);
    schedulerFactory.setResourceLoader(null);
    schedulerFactory.setDataSource(dataSource);
    schedulerFactory.setJobFactory(getSchedulerJobFactory());
    schedulerFactory.setAutoStartup(false);

    return schedulerFactory;
}

@Bean(name = SCHEDULER)
public Scheduler getScheduler()
{
    return getSchedulerFactory().getScheduler();
}

Я получаю ошибку java.lang.ClassFormatError: Duplicate method name&signature in class file org/springframework/scheduling/quartz/SchedulerFactoryBean$$EnhancerBySpringCGLIB$$bee87fe8$$EnhancerBySpringCGLIB$$6bb26669,

Запуск теста с использованием фреймворка Spring 4.0.6 прекрасно работает, но в 4.3.2 он не работает. При использовании 4.0.6 я использовал библиотеку cglib без зависимостей. В 4.3.2 тесты не пройдены независимо от того, использую ли я cglib.

Spring встраивает cglib и objensis в библиотеку ядра 4.3. *. "Кроме того, Spring Framework 4.3 встраивает обновленные ASM 5.1, CGLIB 3.2.4 и Objenesis 2.4 в spring-core.jar". SpringDocs

Мы использовали Java 8 и cglib-no-dep 2.2 с Spring Framework 4.0.6. Мы попытались запустить этот код с автономной библиотекой и без нее и получили те же результаты.

Трассировки стека:

  Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.quartz.Scheduler]: Factory method 'getScheduler' threw exception; nested exception is org.springframework.cglib.core.CodeGenerationException:java.lang.reflect.InvocationTargetException  >null
           at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
           at org.springframework.beans.factory.support.ConstructorResolver$3.run(ConstructorResolver.java:582)
           at java.security.AccessController.doPrivileged(Native Method)
           at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:579)
           ... 112 more
  Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException  >null
           at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:345)
           at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:492)
           at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
  Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 188.486 sec
           at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
           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:116)
           at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
           at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
           at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:337)
           at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.enhanceFactoryBean(ConfigurationClassEnhancer.java:452)
           at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:338)
           at com.example.SpringConfiguration$$EnhancerBySpringCGLIB$$54d3cb35.getSchedulerFactory(<generated>)
           at com.example.SpringConfiguration.getScheduler(SpringConfiguration.java:242)
           at com.example.SpringConfiguration$$EnhancerBySpringCGLIB$$54d3cb35.CGLIB$getScheduler$24(<generated>)
           at com.example.SpringConfiguration$$EnhancerBySpringCGLIB$$54d3cb35$$FastClassBySpringCGLIB$$a2a6e004.invoke(<generated>)
           at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
           at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356)
           at com.example.SpringConfiguration$$EnhancerBySpringCGLIB$$54d3cb35.getScheduler(<generated>)
           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.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
           ... 115 more
  Caused by: java.lang.reflect.InvocationTargetException
           at sun.reflect.GeneratedMethodAccessor26.invoke(Unknown Source)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
           at java.lang.reflect.Method.invoke(Method.java:498)
           at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:413)
           at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:336)
           ... 140 more
  Caused by: java.lang.ClassFormatError: Duplicate method name&signature in class file org/springframework/scheduling/quartz/SchedulerFactoryBean$$EnhancerBySpringCGLIB$$bee87fe8$$EnhancerBySpringCGLIB$$6bb26669
           at java.lang.ClassLoader.defineClass1(Native Method)
           at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
           ... 145 more

1 ответ

Это определенно ошибка в cglib. Кажется, что он точно не определяет метод в иерархии типов, чтобы быть равным другому методу. Используете ли вы Java 8 в сочетании с методами по умолчанию в интерфейсах?

Cglib на самом деле не тестировался на современных версиях Java и практически не требует обслуживания. Новые функции иногда вызывают проблемы при использовании библиотеки.

Другие вопросы по тегам