Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set the classpath that rmiregistry uses?

I'm trying to make a Java RMI client/server app. I'm running into problems starting up the server side of my app, as it keeps running into a ClassNotFoundException during the call to the Registry.bind() method when I attempt to start up the server side of the app.

I started with the simple tutorial here: http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html. After following those instructions, it was initially throwing a ClassNotFoundException complaining that it couldn't find "example.hello.Hello". I was able to resolve that by starting the rmiregistry FROM the destDir directory in the tutorial, since rmiregistry, apparently, uses its initial starting directory as part of its classpath.

I started on my other test app after that, and I was fine until I started to use third-party jar files in my server class. Now Registry.bind() throws a ClassNotFoundException if my server class references anything in any jar file since the rmiregistry app doesn't know about those jar files.

As far as I can tell, rmiregistry does not accept any sort of classpath startup arg, so I'm wondering how I can tell it what classpath I want it to acknowledge. According to the tutorial here: http://docs.oracle.com/javase/tutorial/rmi/running.html, "you must make sure that the shell or window in which you will run rmiregistry either has no CLASSPATH environment variable set or has a CLASSPATH environment variable that does not include the path to any classes that you want downloaded to clients of your remote objects." That sounds like the opposite of what I need... or am I reading it incorrectly? Has anyone had any success starting up a RMI client/server that uses third-party jars (commons-io, commons-logging, and rmiio, in my case)?

This is on Windows, by they way.


Update I found a way around it. See my answer below.

like image 816
Adrian Avatar asked Feb 25 '12 02:02

Adrian


People also ask

What is CLASSPATH How do you set CLASSPATH explain with an example?

set CLASSPATH=%CLASSPATH%;C:\Program Files\Java\jre1.8\rt.jar; In the above command, The set is an internal DOS command that allows the user to change the variable value. CLASSPATH is a variable name. The variable enclosed in percentage sign (%) is an existing environment variable.

How do I find my Java CLASSPATH?

Right click on My Computer and go to properties (or) Press Windows + Pause to open up System Properties. Now traverse to Advanced Tab and click on “Environment Variable”. In order to check the classpath which is set, type echo %CLASSPATH% in command prompt, it will display the CLASSPATH which is set.


2 Answers

The remarks about unsetting the CLASSPATH only apply if you're using the RMI codebase feature, as the cryptic remark about downloading classes is intended to imply.

If you're not using the codebase feature, just either:

  1. Set the CLASSPATH environment variable as required before starting rmiregistry, as shown elsewhere here, or
  2. Start rmiregistry with -J-Djava.class.path=...
  3. Start the Registry inside your server JVM, with LocateRegistry.createRegistry(). This is in many ways the best solution, as it lives and dies with the JVM, shares its classpath, and incidentally complies with the requirements for the codebase feature as well.

If you do (3), you must store the return value into a static variable to prevent it from being garbage-collected, which causes the registry to be unexported, which can lead to DGC of the remote object, which can lead to it being GC'd, which will lead to the listening thread exiting, which can lead to the whole JVM exiting.

like image 60
user207421 Avatar answered Sep 18 '22 05:09

user207421


There is no RMI Registry specific java class path. It should use the same classpath as the rest of the Java system. You can set your classpath by specifying it on the command line, or in your OS environment. Though a little dated, this doc should point you in the right direction.

like image 28
Noah Ternullo Avatar answered Sep 19 '22 05:09

Noah Ternullo