【问题标题】:ClassNotFoundException when client connects to HornetQ客户端连接到 HornetQ 时出现 ClassNotFoundException
【发布时间】:2023-03-04 19:23:02
【问题描述】:

我正在尝试构建一个简单的 JAR,将消息发布到 HornetQ 中的队列,并从 Eclipse 运行 JAR。我收到以下错误。我猜它与程序集版本有关,但我不确定如何追踪它。

javax.naming.NamingException: Failed to lookup [Root exception is java.io.IOException: java.lang.ClassNotFoundException: org.hornetq.core.client.impl.AfterConnectInternalListener]
    at org.jboss.naming.remote.client.ClientUtil.namingException(ClientUtil.java:36)
    at org.jboss.naming.remote.protocol.v1.Protocol$1.execute(Protocol.java:101)
    at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1.lookup(RemoteNamingStoreV1.java:76)
    at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:77)
    at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:81)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at com.me.joel.MessageCreator.createMessage(MessageCreator.java:20)
    at com.me.joel.MessageProducerJar.main(MessageProducerJar.java:9)
Caused by: java.io.IOException: java.lang.ClassNotFoundException: org.hornetq.core.client.impl.AfterConnectInternalListener
    at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:156)
    at org.jboss.naming.remote.protocol.v1.BaseProtocolCommand.readResult(BaseProtocolCommand.java:60)
    at org.jboss.naming.remote.protocol.v1.Protocol$1.handleClientMessage(Protocol.java:146)
    at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1$MessageReceiver$1.run(RemoteNamingStoreV1.java:184)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.hornetq.core.client.impl.AfterConnectInternalListener
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:135)
    at org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:116)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:870)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:902)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1204)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:272)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209)
    at org.jboss.marshalling.river.RiverUnmarshaller.readFields(RiverUnmarshaller.java:1677)
    at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1593)
    at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1557)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1235)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:272)
    at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209)
    at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:37)
    at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:153)
    ... 6 more

这是我的代码:

public void createMessage() throws Exception{
        String destinationName = "queue/test";

        Context ic = null;
        ConnectionFactory cf = null;
        Connection connection =  null;

        try {         
            ic = getInitialContext();

            cf = (ConnectionFactory)ic.lookup("jms/RemoteConnectionFactory");
            //Topic topic = (Topic)ic.lookup(destinationName);
            Queue objQueue = (Queue)ic.lookup(destinationName);

            connection = cf.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer publisher = session.createProducer(objQueue);
            //MessageConsumer subscriber = session.createConsumer(topic);

            //subscriber.setMessageListener(this);
            connection.start();

            TextMessage message = session.createTextMessage("Hello!");
            publisher.send(message);

            //Scanner keyIn = new Scanner(System.in);

            //System.out.print("JMS Server listening. Type a Key + CR to exit\n");
            //keyIn.next();

        }
        finally
        {   
            if(ic != null)
            {
                try
                {
                    ic.close();
                }
                catch(Exception e)  {
                    throw e;
                }
            }

            closeConnection(connection);
        }
    }

    public static Context getInitialContext( ) throws javax.naming.NamingException {

        Properties p = new Properties( );
        p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        //p.put(Context.URL_PKG_PREFIXES," org.jboss.naming:org.jnp.interfaces");
        p.put(Context.PROVIDER_URL, "remote://localhost:4447");
        p.put(Context.SECURITY_PRINCIPAL, "user");
        p.put(Context.SECURITY_CREDENTIALS, "password");
        return new javax.naming.InitialContext(p);
        //return new javax.naming.InitialContext();
    }  

还有我的 POM 依赖项

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
   <!--  <dependency>  
       <groupId>org.hornetq</groupId>  
       <artifactId>hornetq-core</artifactId>  
       <version>2.2.6.Final</version>  
       <scope>provided</scope>  
    </dependency>   -->
    <dependency>
        <groupId>org.hornetq</groupId>
        <artifactId>hornetq-core-client</artifactId>
        <version>2.2.6.Final</version>
        <scope>provided</scope>
    </dependency>
    <!-- <dependency>  
       <groupId>org.hornetq</groupId>  
       <artifactId>hornetq-jms</artifactId>  
       <version>2.2.18.Final</version>  
       <scope>provided</scope>  
    </dependency> -->  
    <dependency>
        <groupId>org.hornetq</groupId>
        <artifactId>hornetq-jms-client</artifactId>
        <version>2.2.18.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hornetq</groupId>
        <artifactId>hornetq-jms-client</artifactId>
        <version>2.2.6.Final</version>
        <scope>provided</scope>
    </dependency>
    <!-- <dependency>  
       <groupId>org.hornetq</groupId>  
       <artifactId>hornetq-logging</artifactId>  
       <version>2.2.6.Final</version>  
       <scope>provided</scope>  
    </dependency>  --> 
    <dependency>
        <groupId>org.hornetq.rest</groupId>
        <artifactId>hornetq-rest</artifactId>
        <version>2.2.2.Final</version>
    </dependency>
    <!-- <dependency>  
       <groupId>org.hornetq</groupId>  
       <artifactId>hornetq-transports</artifactId>  
       <version>2.1.0</version>  
       <scope>compile</scope>  
    </dependency>   -->
<!--    <dependency>  
       <groupId>org.jboss.netty</groupId>  
       <artifactId>netty</artifactId>  
       <version>3.1.0.GA</version>  
    </dependency>   -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <exclusions>
            <exclusion>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javax.jms</groupId>
                <artifactId>jms</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jdmk</groupId>
                <artifactId>jmxtools</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jmx</groupId>
                <artifactId>jmxri</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>  
       <groupId>org.jboss.javaee</groupId>  
       <artifactId>jboss-jms-api</artifactId>  
       <version>1.1.0.GA</version>  
       <scope>compile</scope>  
    </dependency>  

    <dependency>
        <groupId>org.jboss.as</groupId>
        <artifactId>jboss-as-ejb-client-bom</artifactId>
        <version>7.1.0.Final</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>
    <!-- 
  <dependency>  
     <groupId>org.hornetq</groupId>  
     <artifactId>hornetq-core</artifactId>  
     <version>2.0.0.GA</version>  
     <scope>compile</scope>  
  </dependency> 
    <dependency>  
   <groupId>org.hornetq</groupId>  
   <artifactId>hornetq-core-client</artifactId>  
   <version>2.0.0.GA</version>  
   <scope>compile</scope>  
</dependency>  
  <dependency>  
     <groupId>org.hornetq</groupId>  
     <artifactId>hornetq-jms</artifactId>  
     <version>2.0.0.GA</version>  
     <scope>compile</scope>  
  </dependency>  
<dependency>  
   <groupId>org.hornetq</groupId>  
   <artifactId>hornetq-jms-client</artifactId>  
   <version>2.0.0.GA</version>  
   <scope>compile</scope>  
</dependency>  
<dependency>  
   <groupId>org.hornetq</groupId>  
   <artifactId>hornetq-transports</artifactId>  
   <version>2.0.0.GA</version>  
   <scope>compile</scope>  
</dependency>  
<dependency>  
   <groupId>org.jboss.netty</groupId>  
   <artifactId>netty</artifactId>  
   <version>3.1.0.GA</version>  
</dependency>   -->
<dependency>  
   <groupId>org.jboss.javaee</groupId>  
   <artifactId>jboss-jms-api</artifactId>  
   <version>1.1.0.GA</version>  
   <scope>compile</scope>  
</dependency>  
  </dependencies>

【问题讨论】:

    标签: java maven jboss jms hornetq


    【解决方案1】:

    您刚才提到提供了 hornetq-core-client 库:

    <dependency>
        <groupId>org.hornetq</groupId>
        <artifactId>hornetq-core-client</artifactId>
        <version>2.2.6.Final</version>
        <scope>provided</scope>
    </dependency>
    

    这显然不是,因此您会在 org.hornetq.core.client.impl.AfterConnectInternalListener 上获得 ClassNotFoundException。

    【讨论】:

    • 发布的范围是从另一个正在运行的应用程序复制的。 FWIW,该应用程序是作为 WAR 构建的,但它具有各种具有主要方法的类,我可以使用这些方法通过 Eclipse 进行测试。我只是尝试将 hornetq-core-client 更改为“编译”,以及 hornetq-core-client 和 hornetq-jms-client,每次都得到相同的结果。
    • 请解释您的测试是如何运行的。我的意思是如何在 Eclipse 中运行测试。因为我认为 jboss 提供了 hornetq,并且我假设其他应用程序正在 jboss 上运行,但您没有在 jboss 上测试您的代码。
    • 对于这个 JAR,它有一个带有 Main 方法的类。当我在该类的源文件中时,工具栏有一个绿色的“播放”类型按钮,下面有“运行方式”>“Java 应用程序”选项。这导致上述异常。在我提到的 WAR 文件的情况下,WAR 本身旨在部署到 JBOSS,是的。但是,在 src/test/java 中也有一组类。这些类中的每一个都有一个 main 方法,所以如果我打开源文件,我会得到相同的绿色“播放”按钮,我可以将测试类作为 Java 应用程序运行。更多...
    • WAR 是我继承的一个项目,所以我试图把事情分解并理解各个部分。
    • 除非有足够的关于它们运行环境的信息,否则无法说明继承项目中的主要方法是如何工作的。最接近的猜测是您的运行环境没有库。我会删除范围以查看它是否会解决。
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2019-03-17
    相关资源
    最近更新 更多