在运行时动态加载Glassfish JMS jar会抛出NoClassDefFoundError



在这个问题上我迫切需要任何帮助,因为我现在卡住了一段时间。

我的部分应用程序使用Glassfish JMS来传输消息,如果包含jar,则应用程序可以在我的开发机器上顺利工作,现在我需要在运行时动态加载JMS jar,因此我使用以下代码在运行时在类加载器中加载jar

public class ClassPathHack {
    private static final Class<?>[] parameters = new Class[]{URL.class};
    public static synchronized void addFile(String s) throws IOException, Exception {
        File f = new File(s);
        try {
            java.net.URLClassLoader loader = (java.net.URLClassLoader)ClassLoader.getSystemClassLoader();
            java.net.URL url = f.toURI().toURL();
            for (java.net.URL it : java.util.Arrays.asList(loader.getURLs())){
                if (it.equals(url)){
                    return;
                }
            }
            java.lang.reflect.Method method = java.net.URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{java.net.URL.class});
            method.setAccessible(true); 
            method.invoke(loader, new Object[]{url});
        } catch (final java.lang.NoSuchMethodException | 
            java.lang.IllegalAccessException | 
            java.net.MalformedURLException | 
            java.lang.reflect.InvocationTargetException e){
            throw new Exception(e);
        }
    }
}

,在main方法中,我加载了所有JMS使用的jar,然后使用以下代码引发连接到JMS的线程:

public static void loadGlassfishJars(){
    try {
        System.out.println("DEBUGGNG: Loading Glassfish jars");
        ClassPathHack.addFile(glassfishPath + "\glassfish\lib\appserv-rt.jar");
        ClassPathHack.addFile(glassfishPath + "\glassfish\modules\console-jms-plugin.jar");
        ClassPathHack.addFile(glassfishPath + "\glassfish\lib\gf-client.jar");
        ClassPathHack.addFile(glassfishPath + "\mq\lib\imq.jar");
        ClassPathHack.addFile(glassfishPath + "\mq\lib\imqbroker.jar");            
        ClassPathHack.addFile(glassfishPath + "\glassfish\lib\install\applications\jmsra\imqjmsra.jar");
        ClassPathHack.addFile(glassfishPath + "\glassfish\lib\javaee.jar");
        ClassPathHack.addFile(glassfishPath + "\glassfish\modules\jms-admin.jar");
        ClassPathHack.addFile(glassfishPath + "\glassfish\modules\jms-core.jar");
        ClassPathHack.addFile(glassfishPath + "\mq\lib\jms.jar");
        ClassPathHack.addFile(glassfishPath + "\glassfish\modules\jmxremote_optional-repackaged.jar");
    } catch (Exception ex) {
        Logger.getLogger(ZMQTranslator.class.getName()).log(Level.SEVERE, null, ex);
    }

,主方法如下:

     public static void main(String[] args) {
        //loading glassfish jms jars
        loadGlassfishJars();
        //JMS connector thread
        System.out.println("DEBUGGNG:initiating ZMQConnectionReceiver");
        ZMQConnectionReceiver zmqCon = new ZMQConnectionReceiver();
        Thread t = new Thread(zmqCon);
        t.start();
}

在调用ZMQConnectionReceiver类的构造函数时抛出异常,该类导入以下类

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
//NOT RELATED IMPORTS
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Properties;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.json.Json;
import model.DeviceConnection;
import org.zeromq.ZMQ;
import javax.json.stream.*;

,它有一个简单的构造函数,如下所示:

 public ZMQConnectionReceiver(){
            lostNFound = new ConcurrentLinkedDeque();
    }

调用构造函数

时抛出异常。

main线程异常java.lang.NoClassDefFoundError:javax/jms/目的地

我已经检查了目标类在jms.jar中的存在,它在那里。

Glassfish JMS有一个奇怪的行为,它要求连接到它的应用程序应该安装与你试图连接的Glassfish版本相同的jar,任何其他jar都将失败,即使它来自相同的Glassfish版本,但其他安装。

如何解决这个问题?

我通过添加以下依赖项来下载所有JMS依赖项jar,从而设法解决了这个问题

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2</version>
</dependency>

到maven应用程序的pom文件并构建该应用程序。

之后,我将下载的jar包含在我的应用程序中,它作为一个独立的应用程序在任何机器上都可以正常工作。

相关内容

  • 没有找到相关文章

最新更新