我在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控制台进行方法调用时,这对我解决了类装入问题。