我正在尝试使用JMS和ActiveMQ的学校项目。
我复制了O'Reilly的书籍“Java Message Service 2nd Edition Jun 2009”中的代码块。它使用发布和订阅方法,实际上是一个小聊天,每个与主题相关的人都可以向每个人发送消息,每个人都可以看到其他人的消息。我编译程序,一切正常,我尝试运行它,它给了我以下异常:
Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory]
我发现这个问题可能是由于两个原因:
jndi.properties文件未正确定义或尚未添加到类路径中 但我创建它并将其文件夹添加到类路径。这是它包含的内容:
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
java.naming.security.principal=system
java.naming.security.credentials=manager
connectionFactoryNames = TopicCF
topic.topic1 = jms.topic1
有什么问题?我已经尝试了很多年才能使它发挥作用。难道我做错了什么? :(
jndi.properties文件路径是否重要?或者它只需要放在类路径中,从这里可以找到它?
我还从bin文件夹D:\ Programming \ JMS \ ActiveMQ \ apache-activemq-5.2.0 \ bin \
运行了activemq.bat[编辑] --------------------- 所以它适用于Eclipse,但是 现在我已经在环境变量中正确添加了.jar文件,并且我从windows的cmd运行客户端。它没有给出任何错误,当我在Eclipse的控制台中编写时,它出现在cmd控制台中,一切正常,但是当我尝试在cmd中写入时,它会在此行中出错:
publisher.publish(message);
它说
java.lang.NoSuchMethodError: org.apache.activemq.ActiveMQMessageProducerSupport.getDestination()Ljavax/jms/Destination;
有什么想法吗?我真的希望能够在CMD中运行它。 :(
--------------------- [/编辑]
答案 0 :(得分:2)
我现在正在使用Linux,但我敢打赌它必须是:
d:\编程\ JMS \ ActiveMQ的\ Apache的ActiveMQ的-5.2.0的罐强>
此外,如果您使用Eclipse运行它并转到Project - > Build Path和这个jar然后应该没有任何问题。无论如何你可以发布CLASSPATH变量吗?
修改强>
如果你不能帮助我,我无法帮助你。这与任何其他未来的问题或一般工作有关,提供详细信息 - 它总是有帮助的。如果您提供在CMD中运行的EXACT命令以及发生这种情况的类的代码,将会非常有用。java.lang.NoSuchMethodError
一般来说,这意味着jar就位,类也是,但方法不是。当您使用一个版本的jar进行编译时,会发生这种情况,并且在运行时提供了一个删除此方法的jar,因此JRE无法找到它抛出错误。
我刚在电脑上测试
我不明白为什么它不适合你,但它对我有用。这是我的班级:
package com.test;
public class Publisher {
public static void main(String[] args) {
try{
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
ActiveMQSession session = (ActiveMQSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic destination = session.createTopic("FOO.TEST");
TextMessage textMessage = session.createTextMessage("Sample Payload");
TopicPublisher publisher = session.createPublisher(destination);
publisher.publish(textMessage);
session.close();
connection.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
如果我在Maven中使用一个依赖项从eclipse运行它,那么一切都很好:
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.2.0</version>
然后我用 java 和 javac
来做javac -classpath /home/eugen/.m2/repository/org/apache/activemq/activemq-core/5.2.0/activemq-core-5.2.0.jar:/home/eugen/.m2/repository/javax/jms/jms/1.1/jms-1.1.jar Publisher.java
请注意,我添加的唯一内容是两个罐子。
然后是java:
java -classpath /home/eugen/.m2/repository/org/apache/activemq/activemq-core/5.2.0/activemq-core-5.2.0.jar:/home/eugen/.m2/repository/commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar:/home/eugen/.m2/repository/org/apache/camel/camel-core/1.5.0/camel-core-1.5.0.jar:/home/eugen/workspace/t/src/main/java/:/home/eugen/.m2/repository/javax/jms/jms/1.1/jms-1.1.jar:/home/eugen/.m2/repository/org/apache/geronimo/specs/geronimo-j2ee-management_1.0_spec/1.0/geronimo-j2ee-management_1.0_spec-1.0.jar com.test.Publisher
我在类路径中添加了一些必需的jar并运行它 - 它完美无缺。
干杯,尤金。
答案 1 :(得分:0)
我遇到了同样的问题,在我的属性配置结尾处是一个空格(或者似乎是一个空格)。
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
另请注意,您不一定要将jar文件嵌入到客户端代码中。简单地将activemq-all包含为maven依赖项也可以。