前言
我司项目是使用外部Tomcat,配置DataSource获取数据源的方式
有一个factory的配置为org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory。但在对项目微服务化改造的过程中报错:Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory。
springboot.version: 2.3.4.RELEASE
解决错误历程
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_202]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_202]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_202]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_202]
at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:65) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
... 43 common frames omitted
旧工程使用的tomcat版本是:tomcat7版本
新工程使用的内置tomcat版本是:tomcat9
查阅Tomcat9.JNDI资源将factory的值改为:org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory继续报错:
Caused by: javax.naming.NamingException: Found a circular reference involving [java:comp/env/jdbc/testMassData]
at org.apache.naming.factory.LookupFactory.getObjectInstance(LookupFactory.java:76) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) ~[na:1.8.0_202]
at org.apache.naming.NamingContext.lookup(NamingContext.java:857) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:160) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:160) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:160) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:174) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at javax.naming.InitialContext.lookup(InitialContext.java:417) ~[na:1.8.0_202]
at org.apache.naming.factory.LookupFactory.getObjectInstance(LookupFactory.java:127) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) ~[na:1.8.0_202]
at org.apache.naming.NamingContext.lookup(NamingContext.java:857) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:160) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:160) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:160) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:843) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.NamingContext.lookup(NamingContext.java:174) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at javax.naming.InitialContext.lookup(InitialContext.java:417) ~[na:1.8.0_202]
at com.jndi.embedded.dal.DalAutoConfiguration.dataSource(DalAutoConfiguration.java:31) ~[classes/:na]
... 31 common frames omitted
最后,在pom.xml中添加apache的commons-dbcp依赖,仍然报上述错误。
最终,继续将factory的值修改为org.apache.commons.dbcp.BasicDataSourceFactory且ContextResource中不对lookupName设值解决上述问题。
总结
- 当对ContextResource的lookupName设值:JndiLocatorSupport.CONTAINER_PREFIX + "jdbc/testMassData"的时候会报错误:
Found a circular reference involving [java:comp/env/jdbc/testMassData] - 当对ContextResource,不设置factory属性时,报错:
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory - 正确使用JNDI方式:pom.xml引入commons-dbcp 且 内置Tomcat的ContextResource中需要对factory值赋值,并不设置lookupName属性。