我在 Tomcat 7.0.8 中部署了一个 Web 应用程序。最近我开始实现 MBean 以便能够监视一些通常从 quartz 调度程序调用的操作。我使用 JConsole 连接到 Tomcat 的 MBean 服务器并调用一个方法,该方法尝试通过 JNDI 连接到数据库。
当执行到达
Context initContext = new InitialContext();
抛出以下异常:
javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory]
当从常规 servlet(JAX-WS 网络服务)调用该方法时,类加载没有问题。当涉及 JMX 时,类加载的工作方式似乎有所不同,但我无法弄清楚...它是否与 JConsole 告诉我的 RMI class loader disabled
有关?
最佳答案
此类问题的另一种解决方法:检索包含您的 Context initContext = new InitialContext();
的类的类加载器代码,并将其设置为线程的当前类加载器。
ClassLoader origLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
InitialContext ctx = new InitialContext();
Object obj = ctx.lookup("java:global/some/path");
Thread.currentThread().setContextClassLoader(origLoader);
当我从 JMX 控制台进行方法调用时,这对我解决了类加载问题。
关于java - 通过 JMX 连接时,Tomcat 中的 JNDI 上下文初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20447002/