我在Tomcat 7.0.8中部署了一个Web应用程序。最近,我开始实现MBean,以能够监视一些操作,这些操作通常是从石英调度程序中调用的。我使用JConsole连接到Tomcat的MBean服务器,并调用一个方法,该方法尝试通过JNDI连接到数据库。

执行到达时
Context initContext = new InitialContext();引发以下异常:


  javax.naming.NoInitialContextException:无法实例化类:org.apache.naming.java.javaURLContextFactory [根异常是java.lang.ClassNotFoundException:org.apache.naming.java.javaURLContextFactory]


从常规servlet(JAX-WS Web服务)调用该方法时,类加载没有问题。涉及JMX时,类加载的工作方式似乎有所不同,但我不知道如何...它可能与RMI class loader disabled有关,JConsole告诉我了什么?

最佳答案

此类问题的另一种解决方法:检索包含您的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控制台进行方法调用时,这对我解决了类装入问题。

10-02 21:52