ClassNotFoundException после обновления с Spring 3.0.5 до 3.2.1 в приложении RCP

У меня есть приложение RCP с несколькими сотнями пакетов, которое подключено к Spring dm. После обновления до Spring 3.2.1 я получил следующее исключение в паре пакетов. Сначала я думал, что это может быть вызвано некоторой магией в dm, но после тестирования этой теории путем инициализации пакета без dm (просто программный запуск ApplicationContext) я все же столкнулся с тем же исключением.

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

Exception in thread "SpringOsgiExtenderThread-130" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'FileSystemsStackViewControlFactory' defined in OSGi resource[classpath:spring/filesystem-ui.xml|bnd.id=176|bnd.sym=filesystem.ui]: Instantiation of bean failed; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1011)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:957)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutionApplicationContext.java:69)
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355)
    at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320)
    at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:285)
    at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy$CglibSubclassCreator.instantiate(CglibSubclassingInstantiationStrategy.java:117)
    at org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy.instantiateWithMethodInjection(CglibSubclassingInstantiationStrategy.java:69)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:91)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1004)
    ... 15 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.GeneratedMethodAccessor58.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
    ... 21 more
Caused by: java.lang.NoClassDefFoundError: org/springframework/cglib/proxy/Factory
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    ... 26 more
Caused by: java.lang.ClassNotFoundException: org.springframework.cglib.proxy.Factory
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 29 more

Первоначальный манифест представлял собой смесь Require-Bundle и Package-Import, поэтому я попытался полностью удалить Require-Bundle. Не ожидал, что это что-то изменит, но отчаянные времена требуют отчаянных мер, и я был прав, все еще ничего.

В крайнем случае, я также попытался добавить этот атрибут, но без изменений.

DynamicImport-Package: *

Я знаю, что Spring изменил использование cglib в версии 3.1 для встраивания cglib и asm в свои основные jar, но я включил импорт для всех пакетов cglib и asm безрезультатно.

Manifest:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: File System UI
Bundle-SymbolicName: com.mycorp.filesystem.ui;singleton:=true
Bundle-Version: 15.7.0.qualifier
Bundle-Activator: com.mycorp.filesystem.ui.internal.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Import-Package: com.mycorpcse.utils.eclipse,
 com.mycorp.common.ui,
      :
   Many other in house dependencies
      :
 com.mycorp.core,
 org.eclipse.core.commands,
      :
   Many other eclipse dependencies
      :
 org.eclipse.ui.views.properties,
 org.osgi.framework;version="1.7.0",
 org.springframework.asm;version="3.2.1.RELEASE",
 org.springframework.asm.commons;version="3.2.1.RELEASE",
 org.springframework.asm.signature;version="3.2.1.RELEASE",
 org.springframework.asm.util;version="3.2.1.RELEASE",
 org.springframework.beans;version="3.0.5.RELEASE",
 org.springframework.beans.factory.annotation,
 org.springframework.cglib;version="3.2.1.RELEASE",
 org.springframework.cglib.beans;version="3.2.1.RELEASE",
 org.springframework.cglib.core;version="3.2.1.RELEASE",
 org.springframework.cglib.proxy;version="3.2.1.RELEASE",
 org.springframework.cglib.reflect;version="3.2.1.RELEASE",
 org.springframework.cglib.transform;version="3.2.1.RELEASE",
 org.springframework.cglib.transform.impl;version="3.2.1.RELEASE",
 org.springframework.cglib.util;version="3.2.1.RELEASE"
 Export-Package: com.mycorp.filesystem.ui,
 com.mycorp.filesystem.ui.columns,
 com.mycorp.filesystem.ui.model

Обновление: теперь я понимаю, что этот конкретный случай вызывается только при использовании инъекции метода поиска. Поскольку я до сих пор не знаю, как это исправить, мне пришлось изменить конфигурацию, чтобы не использовать эту функцию.

2 ответа

Весной 3.2 они изменили внутреннюю структуру классов. С пакетом OSGI по умолчанию эти классы clib не могут быть найдены. Поэтому вы должны явно указать в файле MANIFEST.MF, что вам нужны эти пакеты, загруженные в контексте.

Вы можете редактировать файл MANIFEST.MF в вашем jar-файле. В разделе "Импорт-пакет" добавьте следующие 3 пакета:

'org.springframework.cglib.core','org.springframework.cglib.proxy','org.springframework.beans.factory'

Или, если вы используете gradle, вы можете сделать следующее (при условии, что у вас уже включен плагин osgi)

jar { manifest { instruction 'Import-Package', 'org.springframework.cglib.core', 'org.springframework.cglib.proxy', 'org.springframework.beans.factory', '*' } }

Мы решили аналогичную проблему, добавив import-пакет org.springframework.cglib и т. Д. В пакет org.springframework.transaction.

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