java - 通过 JMX 连接时,Tomcat 中的 JNDI 上下文初始化失败

标签 java tomcat jndi jmx jconsole

我在 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/

相关文章:

java - Java中如何知道类来自哪里

java - 如何对具有多个值的 Enum 进行编码和解码

java - 部署到 Tomcat 时 Beans 中的 Log4j Logger NullPointerException

java - 如何在 spring 中以声明方式将(绑定(bind))对象放入 jndi?

java - 从 Java 访问 S7 Profinet PLC (1212C) 的资源

java - Thread.sleep() 和 FileWriter()

tomcat - Apache Tomcat 可以处理大于 2 GB 的 HTTP POST 请求吗?

tomcat - Cpanel中的tomcat配置在哪里?

java - 使用 Spring @Value 注解时禁用 JndiProperty 源

java - 如何在远程 ejb 查找期间设置超时?