You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat 9.0.82中JNDI无法定位JMS资源问题求助

解决JUnit测试中Tomcat JNDI资源找不到的问题

你的问题核心是JUnit测试运行在Tomcat容器外的独立JVM中,无法直接访问Tomcat内部的JNDI上下文,所以需要通过配置JNDI环境参数和依赖包来解决。以下是具体步骤:


1. 确保JUnit测试的ClassPath包含必要依赖

把Tomcat和ActiveMQ的核心依赖包加入JUnit测试的classpath:

  • Tomcat安装目录lib下的:catalina.jar、tomcat-jndi.jar
  • ActiveMQ安装目录lib下的:activemq-client.jar、geronimo-jms_1.1_spec.jar

2. 在JUnit测试类中配置JNDI初始上下文

修改ResourcesLocatorTest类中获取InitialContext的代码,添加Tomcat JNDI的环境配置:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.jms.ConnectionFactory;
import javax.jms.Topic;
import java.util.Hashtable;

public class ResourcesLocatorTest {
    @org.junit.Test
    public void testJndiLookup() throws NamingException {
        // 配置JNDI环境参数
        Hashtable<String, String> env = new Hashtable<>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
        env.put(Context.URL_PKG_PREFIXES, "org.apache.naming");

        // 如果是远程Tomcat,需添加以下参数(替换为你的Tomcat地址和账号)
        // env.put(Context.PROVIDER_URL, "rmi://localhost:1099");
        // env.put(Context.SECURITY_PRINCIPAL, "tomcat");
        // env.put(Context.SECURITY_CREDENTIALS, "tomcat");

        InitialContext ctx = new InitialContext(env);
        
        // 注意:必须加上java:comp/env前缀,对应Tomcat web应用的JNDI命名空间
        ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("java:comp/env/jms/ConnectionFactory");
        Topic topic = (Topic) ctx.lookup("java:comp/env/jms/YourTopicName");
        
        // 后续消息收发的测试逻辑...
    }
}

3. 开启Tomcat远程JNDI访问(可选,仅当JUnit在外部JVM运行时)

如果你的Tomcat是独立运行的,需要开启远程JNDI支持:

  1. 修改conf/server.xml,添加JNDI监听:
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  1. 修改conf/tomcat-users.xml,添加具备JNDI访问权限的用户:
<user username="tomcat" password="tomcat" roles="manager-jndi"/>

4. 在ANT构建脚本中配置JUnit的ClassPath

更新build.xml,确保JUnit任务能加载到所需依赖:

<path id="junit.classpath">
    <pathelement location="${tomcat.home}/lib/catalina.jar"/>
    <pathelement location="${tomcat.home}/lib/tomcat-jndi.jar"/>
    <pathelement location="${activemq.home}/lib/activemq-client.jar"/>
    <pathelement location="${activemq.home}/lib/geronimo-jms_1.1_spec.jar"/>
    <pathelement location="target/classes"/>
    <pathelement location="${junit.jar}"/>
</path>

<target name="test" depends="compile">
    <junit printsummary="yes" haltonfailure="yes">
        <classpath refid="junit.classpath"/>
        <test name="com.yourpackage.ResourcesLocatorTest"/>
    </junit>
</target>

内容的提问来源于stack exchange,提问作者Parab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:15:22