apache / apache/incubator-seata
wildfly10中启动抛出java.lang.ClassNotFoundException: io.seata.sqlparser.druid.DruidDbTypeParserImpl
- Dominant language
- Java
- Stars
- 26k
- Forks
- 8.8k
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 4
Description
- [ ] I have searched the [issues](https://github.com/seata/seata/issues) of this repository and believe that this is not a duplicate.
### Ⅰ. Issue Description
1.在main中初始化项目的spring 上下文,正常启动。
2.将项目发布到Tomcat8.5中,正常启动。
3.在wildfly10中启动的时候,会抛出异常java.lang.ClassNotFoundException: io.seata.sqlparser.druid.DruidDbTypeParserImpl
### Ⅱ. Describe what happened
wildfly中启动抛出的异常如下所示:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'storageDataSourceProxy' defined in class path resource [spring/dubbo-storage-service.xml]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.seata.rm.datasource.DataSourceProxy]: Constructor threw exception; nested exception is io.seata.common.loader.EnhancedServiceNotFoundException: not found service provider for : io.seata.sqlparser.util.DbTypeParser caused by java.lang.IllegalStateException: Extension instance(definition: io.seata.common.loader.ExtensionDefinition@b9018c1e, class: interface io.seata.sqlparser.util.DbTypeParser) could not be instantiated: java.lang.ClassNotFoundException: io.seata.sqlparser.druid.DruidDbTypeParserImpl
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.createNewExtension(EnhancedServiceLoader.java:406)
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.getExtensionInstance(EnhancedServiceLoader.java:388)
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.loadExtension(EnhancedServiceLoader.java:360)
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.load(EnhancedServiceLoader.java:249)
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.access$200(EnhancedServiceLoader.java:190)
at io.seata.common.loader.EnhancedServiceLoader.load(EnhancedServiceLoader.java:82)
at io.seata.rm.datasource.util.JdbcUtils.getDbTypeParser(JdbcUtils.java:46)
at io.seata.rm.datasource.util.JdbcUtils.getDbType(JdbcUtils.java:57)
at io.seata.rm.datasource.DataSourceProxy.init(DataSourceProxy.java:92)
at io.seata.rm.datasource.DataSourceProxy.(DataSourceProxy.java:85)
at io.seata.rm.datasource.DataSourceProxy.(DataSourceProxy.java:74)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:285)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:846)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:863)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:144)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:95)
at com.ibangle88.seatatest.servlet.LoadingServlet.initStorage(LoadingServlet.java:40)
at com.ibangle88.seatatest.servlet.LoadingServlet.init(LoadingServlet.java:28)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:250)
at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:133)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:546)
at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:517)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:559)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:101)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
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)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: io.seata.sqlparser.druid.DruidDbTypeParserImpl
at io.seata.sqlparser.druid.DruidDelegatingDbTypeParser.setClassLoader(DruidDelegatingDbTypeParser.java:51)
at io.seata.sqlparser.druid.DruidDelegatingDbTypeParser.(DruidDelegatingDbTypeParser.java:32)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.initInstance(EnhancedServiceLoader.java:573)
at io.seata.common.loader.EnhancedServiceLoader$InnerEnhancedServiceLoader.createNewExtension(EnhancedServiceLoader.java:402)
... 57 more
Caused by: java.lang.ClassNotFoundException: io.seata.sqlparser.druid.DruidDbTypeParserImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at io.seata.sqlparser.druid.DruidIsolationClassLoader.loadInternalClass(DruidIsolationClassLoader.java:53)
at io.seata.sqlparser.druid.DruidIsolationClassLoader.loadClass(DruidIsolationClassLoader.java:42)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at io.seata.sqlparser.druid.DruidDelegatingDbTypeParser.setClassLoader(DruidDelegatingDbTypeParser.java:42)
... 65 more
### Ⅲ. Describe what you expected to happen
### Ⅳ. How to reproduce it (as minimally and precisely as possible)
将https://github.com/seata/seata-samples 中dubbo子项目中的中的Storage部分代码改成web项目即可
### Ⅴ. Anything else we need to know?
抛出异常的代码
类:io.seata.sqlparser.druid.DruidDelegatingDbTypeParser
方法: void setClassLoader(ClassLoader classLoader)
代码行: Class druidDbTypeParserImplClass = classLoader.loadClass("io.seata.sqlparser.druid.DruidDbTypeParserImpl");
原因:
在wildfly中启动的时候,类 io.seata.sqlparser.druid.DruidIsolationClassLoader中的方法
findClassLocation(DruidIsolationClassLoader.class)获取到的结果toString():
vfs:/D:/.../seata-all-1.3.0.jar
(而在Tomcat下获取到的结果是:file:/D:/.../seata-all-1.3.0.jar)
然后在运行到上诉代码行的时候, 会抛出异常(找不到DruidIsolationClassLoader类)
将其中的vfs替换成file之后并重新封装成URL返回, 替换seata-all-1.3.0.jar中的DruidIsolationClassLoader.class之后, wildfly可以启动成功, 不会再抛出io.seata.sqlparser.druid.DruidDbTypeParserImpl找不到的情况
### Ⅵ. Environment:
- JDK version : 1.8.0_192
- OS : Win7
- Others:
zookeeper-3.4.8,
seata-server-1.3.0
dubbo2.7.7
druid-1.1.12
Contributor guide
Research direction
Inspect DruidIsolationClassLoader.findClassLocation and DruidDelegatingDbTypeParser.setClassLoader, focusing on how the WildFly vfs URL is handled versus Tomcat's file URL. Reproduce with the seata-samples Dubbo Storage web project on WildFly 10; done means startup succeeds without the DruidDbTypeParserImpl ClassNotFoundException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100