Java ActiveMQ中的NoSuchMethodError

Java ActiveMQ中的NoSuchMethodError,java,activemq,nosuchmethoderror,Java,Activemq,Nosuchmethoderror,我使用的代码是 java.lang.NoSuchMethodError: org.apache.activemq.thread.TaskRunnerFactory.setThreadClassLoader(Ljava/lang/ClassLoader;)V at org.apache.activemq.broker.BrokerService.getTaskRunnerFactory(BrokerService.java:1265) at org.apache.activemq.

我使用的代码是

java.lang.NoSuchMethodError: org.apache.activemq.thread.TaskRunnerFactory.setThreadClassLoader(Ljava/lang/ClassLoader;)V
    at org.apache.activemq.broker.BrokerService.getTaskRunnerFactory(BrokerService.java:1265)
    at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2346)
    at org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:2305)
    at org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:1017)
    at org.apache.activemq.broker.BrokerService.getAdminConnectionContext(BrokerService.java:2576)
    at org.apache.activemq.broker.BrokerService.startVirtualConsumerDestinations(BrokerService.java:2717)
    at org.apache.activemq.broker.BrokerService.startDestinations(BrokerService.java:2567)
    at org.apache.activemq.broker.BrokerService.doStartBroker(BrokerService.java:726)
    at org.apache.activemq.broker.BrokerService.startBroker(BrokerService.java:720)
    at org.apache.activemq.broker.BrokerService.start(BrokerService.java:623)
    at com.bp.pnc.publisher.app.PncPublisherApplication.main(PncPublisherApplication.java:77)
问题发生在broker.start()方法上。我正在使用activemq 5.14.0。我正在使用Java7。 我查看了文档和发生这种情况的确切位置


this.taskRunnerFactory.setThreadClassLoader(this.getClass().getClassLoader())

发生此错误的原因不同:

  • 使用比用于编译源代码的旧activemq.jar运行应用程序
  • 应用程序的类路径中有更多的JAR,其中一个还包含activemq的类(因为它自己使用类)。如果该jar在activemq.jar之前加载(即它出现在acitvemq.jar的“前面”),则旧版本正在使用中
如果是后者,则可以将以下代码放入类中(在问题中显示的代码之前),以查看从何处加载类:

BrokerService broker = new BrokerService();
TransportConnector connector = new TransportConnector();
connector.setUri(new URI("tcp://localhost:61616"));
broker.addConnector(connector);
broker.start();

实际上,我做了您编写的工作,它将位置显示为文件:/C:/Users/yahg3h/.m2/repository/org/apache/activemq/activemq-client/5.9.1/activemq-client-5.9.1.jar/org/apache/activemq/thread/TaskRunnerFactory.class那么这意味着什么呢?我有一个父pom,它直接从我们公司的存储库下载5.9.1 jar。我认为这就是它存在的原因。如何确保只有5.14.0可用,而不是5.9.1?5.9.1<5.14.0,因此您的应用程序使用的库比用于编译的库旧。如何修复此问题?是否需要更改pom?因为这是一个子pom,还有另一个父pom,这会产生什么影响?这是一个新问题,因为我对maven不太熟悉,所以我无法确定如何修复pom.xml
Class clazz = TaskRunnerFactory.class;
String name = clazz.getName().replace('.', '/') + ".class";
String loc = clazz.getClassLoader().getResource(name).toString();
System.out.println(loc);