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支持:
- 修改
conf/server.xml,添加JNDI监听:
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
- 修改
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
相关产品推荐
相关产品推荐

