Java自定义类加载和RMI

时间:2014-08-15 04:07:07

标签: java rmi

编辑:我决定在从我的RMI界面返回的类中正确设置/处理serialUID。这将避免必须进行任何自定义类加载/管理,在几行中解决我的问题,并避免很多麻烦。感谢大家的建议和帮助!

我目前面临的问题是必须通过Java RMI与可能使用相同JAR的2个不同版本的设备进行通信。我有一个每个JAR的客户端副本(修剪到必要的类和存根)。服务器/客户端之间的通信使用一个未更改的接口(更改的内容是接口方法返回的对象的定义和& serialUID)。

理想情况下,我希望能够做的是从客户端的一个JAR预加载类,然后尝试在接口上调用一个方法来检索一个对象。如果解编失败,我想尝试从其他JAR加载类并再次尝试。

到目前为止我做了什么:

启动VM时,我没有在类路径中包含任何一个JAR。然后我创建了一个继承自RMIClassLoaderSpi的类(CustomClassLoader),并使用java.rmi.server.RMIClassLoaderSpi属性将其设置为RMI类加载器。在这个自定义加载器loadClass方法中,我基本上检查要加载的类的名称是否与我感兴趣的那个匹配,如果是,我从JAR加载它,然后缓存Class对象以便稍后返回。

这似乎是使用我的自定义加载器在JAR中加载我的接口存根和其他类但是当我这样做时:

(EmsRMIInterface)Naming.lookup(path)

尝试获取我的接口引用,我得到一个ClassNotFoundException。看起来演员正在使用不同的URLClassLoader,我不知道如何强制它使用我的自定义。关于我能做什么的任何建议/想法?

Caused by: java.lang.ClassNotFoundException: ems.rmi.EmsRMIInterface
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

0 个答案:

没有答案