C
Clayton Cramer
I hope that I am asking this in the right group.
1. I am looking at the possibility of replacing our browser-based JSP/Struts client talking to Java server classes with a thick client written in Java.. (Yes, for most enterprise systems, this would not be a great idea, but for us it does make sense: we have a few hundred PCs talking to our servers;there are never one time users connecting to our servers unless it's a security breach.)
2. I I started with the Oracle demo where the client makes a request for the value of pi to an arbitrary number of places, and the server computes it and passes it back to the client.
I was able to get this working using javac and jar from the command line (which involves bundling the class files into a JAR, copying it over to the tomcat webapps directory). My guess is that there is some way to set this upin MyEclipse so that it compiles and redeploys--but it is not exactly obvious how to set this up.
I am using MyEclipse 9.1, Tomcat 5.0.28 (please don't laugh; we're working on moving into modern times, and getting rid of our papyrus and clay tablets).
To simplify figuring out what is broken, I have taken the Oracle tutorial code and put in a single project, divided into three packages: client, compute, and engine. I can start the server (engine) with the following DOS batch file:
java -cp "c:\Documents and Settings\ccramer\Workspaces\MyEclipse 9\rmi\src";c:\tomcat5\webapps\rmi\compute.jar -Djava.rmi.server.codebase=file:/c:\tomcat5\webapps\rmi\compute.jar -Djava.security.policy=server.policy engine.ComputeEngine
I can run the client side from the command line with the following DOS batch file:
view plaincopy to clipboardprint?
java -cp "c:\Documents and Settings\ccramer\Workspaces\MyEclipse 9\rmi\src";c:\tomcat5\webapps\rmi\compute.jar -Djava.rmi.server.codebase=file:/c:\tomcat5\webapps\rmi\computer.jar -Djava.security.policy=client.policy client.ComputePi localhost %1%
where %1% is the parameter passed to the batch file specifying the number of digits of pi to have the server side calculate and return.
Then I tried to get MyEclipse to start the server in pretty much the equivalent way using the Run Configurations...:
Main.class: engine.ComputeEngine
Classpath: default classpath and c:\tomcat5\webapps\rmi\compute.jar
Environment: java.rmi.server.codebase=file:/c:\tomcat5\webapps\rmi\compute.jar
java.security.policy=server.policy
Code:
ComputeEngine exception:
java.rmi.ServerException: RemoteException occurred in server thread; nestedexception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: compute.Compute
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport..java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at engine.ComputeEngine.main(ComputeEngine.java:29)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: compute.Compute
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport..java:701)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassNotFoundException: compute.Compute
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:707)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:651)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:588)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.i
bjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
at java.i
bjectInputStream.readClassDesc(ObjectInputStream.java:1457)
at java.i
bjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.i
bjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.i
bjectInputStream.readObject(ObjectInputStream.java:339)
... 9 more
As you can see, there is a ClassNotFoundException: compute.Compute
I'm hard pressed to see why. If I do a jar -tf c:\tomcat5\webapps\rmi\compute.jar I get:
Code:
META-INF/
META-INF/MANIFEST.MF
compute/Compute.class
compute/Task.class
Any suggestions?
1. I am looking at the possibility of replacing our browser-based JSP/Struts client talking to Java server classes with a thick client written in Java.. (Yes, for most enterprise systems, this would not be a great idea, but for us it does make sense: we have a few hundred PCs talking to our servers;there are never one time users connecting to our servers unless it's a security breach.)
2. I I started with the Oracle demo where the client makes a request for the value of pi to an arbitrary number of places, and the server computes it and passes it back to the client.
I was able to get this working using javac and jar from the command line (which involves bundling the class files into a JAR, copying it over to the tomcat webapps directory). My guess is that there is some way to set this upin MyEclipse so that it compiles and redeploys--but it is not exactly obvious how to set this up.
I am using MyEclipse 9.1, Tomcat 5.0.28 (please don't laugh; we're working on moving into modern times, and getting rid of our papyrus and clay tablets).
To simplify figuring out what is broken, I have taken the Oracle tutorial code and put in a single project, divided into three packages: client, compute, and engine. I can start the server (engine) with the following DOS batch file:
java -cp "c:\Documents and Settings\ccramer\Workspaces\MyEclipse 9\rmi\src";c:\tomcat5\webapps\rmi\compute.jar -Djava.rmi.server.codebase=file:/c:\tomcat5\webapps\rmi\compute.jar -Djava.security.policy=server.policy engine.ComputeEngine
I can run the client side from the command line with the following DOS batch file:
view plaincopy to clipboardprint?
java -cp "c:\Documents and Settings\ccramer\Workspaces\MyEclipse 9\rmi\src";c:\tomcat5\webapps\rmi\compute.jar -Djava.rmi.server.codebase=file:/c:\tomcat5\webapps\rmi\computer.jar -Djava.security.policy=client.policy client.ComputePi localhost %1%
where %1% is the parameter passed to the batch file specifying the number of digits of pi to have the server side calculate and return.
Then I tried to get MyEclipse to start the server in pretty much the equivalent way using the Run Configurations...:
Main.class: engine.ComputeEngine
Classpath: default classpath and c:\tomcat5\webapps\rmi\compute.jar
Environment: java.rmi.server.codebase=file:/c:\tomcat5\webapps\rmi\compute.jar
java.security.policy=server.policy
Code:
ComputeEngine exception:
java.rmi.ServerException: RemoteException occurred in server thread; nestedexception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: compute.Compute
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport..java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at engine.ComputeEngine.main(ComputeEngine.java:29)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: compute.Compute
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport..java:701)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassNotFoundException: compute.Compute
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:707)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:651)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:588)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.i
at java.i
at java.i
at java.i
at java.i
... 9 more
As you can see, there is a ClassNotFoundException: compute.Compute
I'm hard pressed to see why. If I do a jar -tf c:\tomcat5\webapps\rmi\compute.jar I get:
Code:
META-INF/
META-INF/MANIFEST.MF
compute/Compute.class
compute/Task.class
Any suggestions?