简体   繁体   English

Tomcat抛出错误“java.lang.ClassNotFoundException:org.apache.naming.java.javaURLContextFactory”

[英]Tomcat throwing error “java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory”

I am trying to open database connection from my code using datasource. 我试图使用数据源从我的代码打开数据库连接。 The webapp is deployed in Tomcat. webapp部署在Tomcat中。 But when opening connection Tomcat throws below error: 但是当打开连接时Tomcat会抛出以下错误:

javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) ~[?:1.8.0_161]
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) ~[?:1.8.0_161]
at javax.naming.InitialContext.init(Unknown Source) ~[?:1.8.0_161]
at javax.naming.InitialContext.<init>(Unknown Source) ~[?:1.8.0_161]
at com.profinch.fincluez.jdbc.JDBCConnection$ConnectionHandler.<init>(JDBCConnection.java:244) [classes/:?]
at com.profinch.fincluez.jdbc.JDBCConnection$ConnectionHandler.<init>(JDBCConnection.java:214) [classes/:?]
at com.profinch.fincluez.jdbc.JDBCConnection.getConnection(JDBCConnection.java:86) [classes/:?]
at com.profinch.fincluez.jdbc.RDBMSQueryEngine.loadData(RDBMSQueryEngine.java:190) [classes/:?]
at com.profinch.fincluez.jdbc.QueryEngineWrapper.loadData(QueryEngineWrapper.java:62) [classes/:?]
at com.profinch.fincluez.infra.loaders.ConfigLoaderQueryMode.loadData(ConfigLoaderQueryMode.java:64) [classes/:?]
at com.profinch.fincluez.infra.loaders.ConfigLoaderQueryMode.compute(ConfigLoaderQueryMode.java:82) [classes/:?]
at com.profinch.fincluez.infra.loaders.ConfigLoaderQueryMode.compute(ConfigLoaderQueryMode.java:1) [classes/:?]
at java.util.concurrent.RecursiveTask.exec(Unknown Source) [?:1.8.0_161]
at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) [?:1.8.0_161]
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source) [?:1.8.0_161]
at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) [?:1.8.0_161]
at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) [?:1.8.0_161]

Caused by: java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory
at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_161]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_161]
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[?:1.8.0_161]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_161]
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_161]
at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_161]
at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source) ~[?:1.8.0_161]
at com.sun.naming.internal.VersionHelper12.loadClass(Unknown Source) ~[?:1.8.0_161]
... 17 more

Thing is I am able to see my web-app is able to open 3 connections then load properties and partial configuration from database and then close those properly. 事情是我能够看到我的网络应用程序能够打开3个连接,然后从数据库加载属性和部分配置,然后正确关闭它们。 This I know because I have a centralized API through which all connections are being opened and closed. 我知道这是因为我有一个集中的API,通过它可以打开和关闭所有连接。 So there I am keeping count of number of connections getting opened and closed. 所以我会保持打开和关闭连接数的计数。 But from 4th connection onwards I get this error. 但是从第4个连接起,我得到了这个错误。 I am running several threads and each thread is opening and closing connection and each of them fails with this same error. 我正在运行多个线程,每个线程都打开和关闭连接,每个线程都因同样的错误而失败。

Code to open Connection: 代码打开连接:

InitialContext initialContext = new InitialContext();//throwing exception here
DataSource dataSource = (DataSource) initialContext.lookup("java:/comp/env/jdbc/OracleDS");
Connection l_conn = dataSource.getConnection ();

Datasource details in Tomcat: Tomcat中的数据源详细信息:

<Resource name="jdbc/OracleDS" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" username="test" password="test" url="jdbc:oracle:thin:@localhost:1521/sid" initialSize="5" maxTotal="15" defaultAutoCommit="false" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

This issue is in Tomcat only and when I deploy my code in Wildfly11/Glassfish and connect to its Datasource I face no issues and code runs smoothly. 此问题仅在Tomcat中,当我在Wildfly11 / Glassfish中部署我的代码并连接到其数据源时,我没有遇到任何问题,代码运行顺利。

I have gone through some posts and some suggested to do the below thing but still getting same error: 我已经浏览了一些帖子,有些人建议做下面的事情,但仍然得到同样的错误:

Properties l_props = new Properties();
l_props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
l_props.put(Context.URL_PKG_PREFIXES, "org.apache.naming");
InitialContext initialContext = new InitialContext(l_props);//Still throws Exception

Environment Details 环境细节

  • Java 1.8.0_161 Java 1.8.0_161
  • Tomcat 8.5 (same error on Tomcat 9.0.6) Tomcat 8.5(Tomcat 9.0.6上的错误相同)
  • OS: Windows 10 Pro 64 bit 操作系统:Windows 10 Pro 64位

Note: I am runing the web-app from Tomcat server and not from any IDE and not using JUnit. 注意:我从Tomcat服务器运行Web应用程序,而不是从任何IDE运行,而不是使用JUnit。

[Update: 15-March-2018]: I have some how managed to narrow down the problem. [更新:2018年3月15日]:我有一些如何设法缩小问题的范围。 I am running several tasks in parallel using Fork Join Framework and each task opens a dedicated connection and closes it. 我使用Fork Join Framework并行运行多个任务,每个任务打开一个专用连接并关闭它。 Tasks are not using any shared connection. 任务未使用任何共享连接。 So this error appears when all task runs in parallel. 因此,当所有任务并行运行时,会出现此错误。 If I change the code to run these task sequentially by giving the ForkJoinPool size as 1 then this error does not appear. 如果我通过将ForkJoinPool大小设置为1来更改代码以顺序运行这些任务,则不会出现此错误。 Currently I have 5 tasks running in parallel and my data source connection pool size is configured with maxTotal=20. 目前我有5个并行运行的任务,我的数据源连接池大小配置为maxTotal = 20。 Not sure what is happening. 不确定发生了什么。

[Update 16-Match-2018]: If anybody is interested to simulate this issue, I have uploaded test code on Git. [更新16-Match-2018]:如果有人有兴趣模拟这个问题,我已经在Git上传了测试代码。 URL: Git Hub Repository URL: Git Hub存储库

I was able to find the answer after posting the same to Tomcat's mailing list. 在将相同内容发布到Tomcat的邮件列表后,我找到了答案。 From the discussions there it seems this is happening due to memory leak fix provided in Tomcat. 从讨论中看来,由于Tomcat中提供的内存泄漏修复,这种情况似乎正在发生。 Refer to the following link Tomcat Bug 60620 请参阅以下链接Tomcat Bug 60620

and the various threads linked from there. 以及从那里链接的各种线程。

I wrote the following code just before creating the initial context and JNDI lookup to resolve this issue: 我在创建初始上下文和JNDI查找之前编写了以下代码来解决此问题:

//Fix Start
Thread l_thread = Thread.currentThread();
l_thread.setContextClassLoader(this.getClass().getClassLoader());
//Fix End
initialContext  = new InitialContext();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.ClassNotFoundException:Tomcat 6上的org.apache.naming.java.javaURLContextFactory - java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory on Tomcat 6 无法实例化类:org.apache.naming.java.javaURLContextFactory - Cannot instantiate class: org.apache.naming.java.javaURLContextFactory java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlObject 错误 - java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlObject Error java.lang.ClassNotFoundException: org.apache.poi.POIXMLTypeLoader 错误 - java.lang.ClassNotFoundException: org.apache.poi.POIXMLTypeLoader error java.lang.ClassNotFoundException抛出一些错误 - java.lang.ClassNotFoundException throwing some error Tomcat java.lang.ClassNotFoundException - Tomcat java.lang.ClassNotFoundException org.apache.commons.lang.SerializationException:java.lang.ClassNotFoundException - org.apache.commons.lang.SerializationException: java.lang.ClassNotFoundException Tomcat 未启动&gt; java.lang.ClassNotFoundException: org.apache.catalina.startup.Catalina - Tomcat Not starting up> java.lang.ClassNotFoundException: org.apache.catalina.startup.Catalina Java和Tomcat org.json java.lang.ClassNotFoundException - Java and Tomcat org.json java.lang.ClassNotFoundException java.lang.ClassNotFoundException:org.apache.catalina.connector.Response - java.lang.ClassNotFoundException: org.apache.catalina.connector.Response
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM