Spring 中的 NoClassDefFoundError JBoss 中的对象化
NoClassDefFoundError in Spring Objenesis in JBoss
I'm sorry for the long post ahead but it's required for understanding
the problem correctly in my opinion
上下文
我在 Jboss EAP 上使用 Spring 多模块应用程序,所有依赖 jar 在 Jboss 模块(共享库)中:
<dependencies>
<module name="com.etcbase.sharedlib" slot="4.3.14" export="true" meta-inf="export" />
<module name="org.jboss.jts" />
</dependencies>
除此之外,我正在使用 Hotswap-Agent,它使用 spring objenesis 来实现其功能,如以下创建热交换代理的 spring 方法:
private Method getProxyCreationMethod(Object bean) throws CannotCompileException, NotFoundException {
if (getCp(loader).find("org.springframework.cglib.proxy.MethodInterceptor") != null) {
if (createSpringProxy == null) {
synchronized (springLock) {
if (createSpringProxy == null) {
ClassPool cp = getCp(loader);
springCallback = buildProxyCallbackClass(SPRING_PACKAGE, cp);
springNamingPolicy = buildNamingPolicyClass(SPRING_PACKAGE, cp);
springProxy = buildProxyCreaterClass(SPRING_PACKAGE, springCallback, springNamingPolicy, cp);
createSpringProxy = springProxy.getDeclaredMethods()[0];
}
}
}
return createSpringProxy;
现在在创建 SpringProxy 之后,它在下面使用它进行 java 反射:
private Object doCreate(Object beanFactry, Object bean, Class<?>[] paramClasses, Object[] paramValues) {
try {
Method proxyCreater = getProxyCreationMethod(bean);
if (proxyCreater == null) {
return bean;
} else {
return proxyCreater.invoke(null,beanFactry, bean, paramClasses, paramValues);
}
} catch (IllegalArgumentException | InvocationTargetException e) {
LOGGER.warning("Can't create proxy for " + bean.getClass().getSuperclass()
+ " because there is no default constructor,"
+ " which means your non-singleton bean created before won't get rewired with new props when update class.");
return bean;
} catch (IllegalAccessException | CannotCompileException | NotFoundException e) {
LOGGER.error("Creating a proxy failed", e);
throw new RuntimeException(e);
}
}
因此在 proxyCreater(来自 SpringProxy 方法)尝试使用调用功能之后。然后它抛出 InvocationTargetException 并打印警告它不能热交换 bean,因为它没有默认构造函数。
问题:
调试后问题的根本原因是:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils
从上面完成调试日志:
HOTSWAP AGENT: 10:49:35.672 ERROR (org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater) - Can't create proxy for class com.etcbase.sfc.util.IdManagerImpl because there is no default constructor, which means your non-singleton bean created before won't get rewired with new props when update class.
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) HOTSWAP AGENT: 10:49:35.673 WARNING (org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater) - error
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) java.lang.reflect.InvocationTargetException
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at java.lang.reflect.Method.invoke(Method.java:498)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater.doCreate(EnhancerProxyCreater.java:114)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater.create(EnhancerProxyCreater.java:83)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater.createProxy(EnhancerProxyCreater.java:79)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.ProxyReplacer.register(ProxyReplacer.java:85)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1316)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1282)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.DeploymentManagerImpl.call(DeploymentManagerImpl.java:205)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.DeploymentManagerImpl.call(DeploymentManagerImpl.java:174)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction.call(ServletRequestContextThreadSetupAction.java:42)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.ContextClassLoaderSetupAction.call(ContextClassLoaderSetupAction.java:43)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create[=15=](SecurityContextThreadSetupAction.java:105)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:239)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:99)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.run(UndertowDeploymentService.java:81)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at java.lang.Thread.run(Thread.java:748)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.jboss.threads.JBossThread.run(JBossThread.java:320)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) Caused by: org.springframework.objenesis.ObjenesisException: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.SpringObjenesis.newInstantiatorOf(SpringObjenesis.java:149)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.SpringObjenesis.newInstance(SpringObjenesis.java:100)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at HotswapAgentSpringBeanProxy_1796692748.create(HotswapAgentSpringBeanProxy_1796692748.java)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) ... 92 more
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.instantiator.sun.UnsafeFactoryInstantiator.<init>(UnsafeFactoryInstantiator.java:43)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:98)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.SpringObjenesis.newInstantiatorOf(SpringObjenesis.java:125)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) ... 94 more
从上面看来 spring obejenisis Unsafe utils 不能被 Jboss 的当前类加载器访问(这里看起来是 JbossModuleLoader),除此之外从那里我检查了它各自的 jar 中的 UnsafeUtils,它位于 Jboss Module is used for all jars.
我会 link 我在 github 上创建的问题,因为它可能会有所帮助,但这就是我所能知道的。
有没有办法通过另一个类加载器找到 unsafeutils 或者这是另一个问题?
To solve "Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils" issue, please add followings to your jboss module.xml file. UnsafeUtils class has a static initialization block that references to sun.misc.Unsafe.
<dependencies>
....
<module name="sun.jdk" export="true" >
<imports>
<include path="sun/misc/Unsafe" />
</imports>
</module>
</dependencies>
</module>
I'm sorry for the long post ahead but it's required for understanding the problem correctly in my opinion
上下文
我在 Jboss EAP 上使用 Spring 多模块应用程序,所有依赖 jar 在 Jboss 模块(共享库)中:
<dependencies>
<module name="com.etcbase.sharedlib" slot="4.3.14" export="true" meta-inf="export" />
<module name="org.jboss.jts" />
</dependencies>
除此之外,我正在使用 Hotswap-Agent,它使用 spring objenesis 来实现其功能,如以下创建热交换代理的 spring 方法:
private Method getProxyCreationMethod(Object bean) throws CannotCompileException, NotFoundException {
if (getCp(loader).find("org.springframework.cglib.proxy.MethodInterceptor") != null) {
if (createSpringProxy == null) {
synchronized (springLock) {
if (createSpringProxy == null) {
ClassPool cp = getCp(loader);
springCallback = buildProxyCallbackClass(SPRING_PACKAGE, cp);
springNamingPolicy = buildNamingPolicyClass(SPRING_PACKAGE, cp);
springProxy = buildProxyCreaterClass(SPRING_PACKAGE, springCallback, springNamingPolicy, cp);
createSpringProxy = springProxy.getDeclaredMethods()[0];
}
}
}
return createSpringProxy;
现在在创建 SpringProxy 之后,它在下面使用它进行 java 反射:
private Object doCreate(Object beanFactry, Object bean, Class<?>[] paramClasses, Object[] paramValues) {
try {
Method proxyCreater = getProxyCreationMethod(bean);
if (proxyCreater == null) {
return bean;
} else {
return proxyCreater.invoke(null,beanFactry, bean, paramClasses, paramValues);
}
} catch (IllegalArgumentException | InvocationTargetException e) {
LOGGER.warning("Can't create proxy for " + bean.getClass().getSuperclass()
+ " because there is no default constructor,"
+ " which means your non-singleton bean created before won't get rewired with new props when update class.");
return bean;
} catch (IllegalAccessException | CannotCompileException | NotFoundException e) {
LOGGER.error("Creating a proxy failed", e);
throw new RuntimeException(e);
}
}
因此在 proxyCreater(来自 SpringProxy 方法)尝试使用调用功能之后。然后它抛出 InvocationTargetException 并打印警告它不能热交换 bean,因为它没有默认构造函数。
问题: 调试后问题的根本原因是:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils
从上面完成调试日志:
HOTSWAP AGENT: 10:49:35.672 ERROR (org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater) - Can't create proxy for class com.etcbase.sfc.util.IdManagerImpl because there is no default constructor, which means your non-singleton bean created before won't get rewired with new props when update class.
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) HOTSWAP AGENT: 10:49:35.673 WARNING (org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater) - error
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) java.lang.reflect.InvocationTargetException
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at java.lang.reflect.Method.invoke(Method.java:498)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater.doCreate(EnhancerProxyCreater.java:114)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater.create(EnhancerProxyCreater.java:83)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.EnhancerProxyCreater.createProxy(EnhancerProxyCreater.java:79)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.hotswap.agent.plugin.spring.getbean.ProxyReplacer.register(ProxyReplacer.java:85)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1316)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1282)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,673 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,675 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
10:49:35,676 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.DeploymentManagerImpl.call(DeploymentManagerImpl.java:205)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.DeploymentManagerImpl.call(DeploymentManagerImpl.java:174)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction.call(ServletRequestContextThreadSetupAction.java:42)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.ContextClassLoaderSetupAction.call(ContextClassLoaderSetupAction.java:43)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create[=15=](SecurityContextThreadSetupAction.java:105)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create[=15=](UndertowDeploymentInfoService.java:1508)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:239)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:99)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.run(UndertowDeploymentService.java:81)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
10:49:35,677 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at java.lang.Thread.run(Thread.java:748)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.jboss.threads.JBossThread.run(JBossThread.java:320)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) Caused by: org.springframework.objenesis.ObjenesisException: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.SpringObjenesis.newInstantiatorOf(SpringObjenesis.java:149)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.SpringObjenesis.newInstance(SpringObjenesis.java:100)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at HotswapAgentSpringBeanProxy_1796692748.create(HotswapAgentSpringBeanProxy_1796692748.java)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) ... 92 more
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.instantiator.sun.UnsafeFactoryInstantiator.<init>(UnsafeFactoryInstantiator.java:43)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:98)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) at org.springframework.objenesis.SpringObjenesis.newInstantiatorOf(SpringObjenesis.java:125)
10:49:35,678 INFO [stdout] (ServerService Thread Pool -- 19) ... 94 more
从上面看来 spring obejenisis Unsafe utils 不能被 Jboss 的当前类加载器访问(这里看起来是 JbossModuleLoader),除此之外从那里我检查了它各自的 jar 中的 UnsafeUtils,它位于 Jboss Module is used for all jars.
我会 link 我在 github 上创建的问题,因为它可能会有所帮助,但这就是我所能知道的。
有没有办法通过另一个类加载器找到 unsafeutils 或者这是另一个问题?
To solve "Could not initialize class org.springframework.objenesis.instantiator.util.UnsafeUtils" issue, please add followings to your jboss module.xml file. UnsafeUtils class has a static initialization block that references to sun.misc.Unsafe.
<dependencies>
....
<module name="sun.jdk" export="true" >
<imports>
<include path="sun/misc/Unsafe" />
</imports>
</module>
</dependencies>
</module>