Search code examples
javalinuxrmiclassnotfoundexception

Java RMI ClassNotFoundException on stub occurs in Linux but not Windows


I'm getting the following exception when attempting to use Naming.lookup() to create an RMI object:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.lang.ClassNotFoundException: project.server.data.RmiMainObjImpl_Stub
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:101)
    ... 2 more
Caused by: java.lang.ClassNotFoundException: project.server.data.RmiMainObjImpl_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1206)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1219)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:452)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:185)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:214)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    ... 4 more

Curiously, this error only happens under Linux and AIX, but never under Windows. The error happens consistently, but seemingly works under some versions of Java:

  • The original jar was built with 1.6.0u30 on a Windows machine
  • The original jar will not work under Linux using 1.7.0u60, but will work with 1.6.0u24
  • The original jar will not work under AIX using 1.6 64-bit, but will work with 32-bit
  • Building the jar on a Linux machine using 1.7.0u60 will actually not work with the same runtime on that machine

My policy file seems to be set up correctly and is being recognized (though, I'm guessing I'd have a different error if it was not):

grant {
    permission java.security.AllPermission "", "";
};

I'm executing java with a command line similar to this:

java -cp ./.:./JProjApi.jar:./MyRMI.jar -Djava.security.policy=./policy.all com/project/rmi/Main

And the code looks like this:

System.setSecurityManager(new RMISecurityManager());
rmiObj = (project.server.data.RmiMainObj_1_0) Naming.lookup("rmi://172.17.44.45/RMIMain");

I do not have access to the server-side (and I'm consuming a jar that has the necessary client-side interfaces as well).

Any ideas on what might be going wrong?


Solution

  • Figuring this out became a much lower priority, but it came back.

    Network scanning showed nothing unusual.

    It turned out that it did, in fact, have at least something to do with the Java version or new settings on newer Java versions.

    This: -Djava.rmi.server.useCodebaseOnly=false Had to be added to the command line and it now works for those machines it didn't previously work on.