Thank you  Lukasz and Raymond. I will think about both solutions


From: osgi-dev-boun...@mail.osgi.org [mailto:osgi-dev-boun...@mail.osgi.org] On 
Behalf Of Raymond Auge
Sent: Wednesday, February 25, 2015 12:37 PM
To: OSGi Developer Mail List
Subject: Re: [osgi-dev] ClassNotFoundException with RMI

All you need is your RMI bundle to track a ?Marshaller? interface which 
bundles, interested in having their services RMI'd, register an impl which 
handles the (un)marshalling. The services might have a property listing the 
types they handle, or maybe it's a method call to test for support...

- Ray

On Wed, Feb 25, 2015 at 12:19 PM, Łukasz Dywicki 
<luk...@dywicki.pl<mailto:luk...@dywicki.pl>> wrote:
A while ago I had similar issue as yours which was affecting our RMI-based 
integration. Since I didn't want to turn on JVM security and enable RMI class 
loader I did following:
1. embedded all RMI contract classes which could be possibly loaded via RMI
2. my RMI client was executed from servlet thread so I had to override thread 
context class loader for each invocation.

Best regards,
Lukasz

2015-02-25 18:14 GMT+01:00 Endo Alejandro 
<alejandro.e...@grassvalley.com<mailto:alejandro.e...@grassvalley.com>>:
Hello everyone
We are having an issue where we have a class that is an entry point to RMI (an 
rmi proxy). As such, it deserializes remote objects before passing them to the 
appropriate entity. However, this generic “gate-keeper” is throwing an 
ClassNotFoundException since it doesn’t have a wire for the class that it is 
trying to deserialize

java.rmi.ServerException: RemoteException occurred in server thread; nested 
exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: com.foo.SupportedCommand
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:354)
at sun.rmi.transport.Transport$1.run(Transport.java:178)
at sun.rmi.transport.Transport$1.run(Transport.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:174)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:557)
at 
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:812)
at 
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:671)
at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at 
sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162)
at 
java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at 
java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy1.setParameter(Unknown Source)
at com.foo.proxy.GenericProxy.setParameter
at com.foo.proxy.AlarmManager$3.setParameter
at com.foo.proxy.AlarmManager$3.run
at com.foo.ThreadPool$PooledThread.run
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested 
exception is:
java.lang.ClassNotFoundException: com.foo.SupportedCommand
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:314)
at sun.rmi.transport.Transport$1.run(Transport.java:178)
at sun.rmi.transport.Transport$1.run(Transport.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:174)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:557)
at 
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:812)
at 
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:671)
at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: com.foo.SupportedCommand
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at com.foo.rmi.LoaderHandler.loadClass
at com.foo.rmi.LoaderHandler.loadClass
at com.foo.rmi.ClassLoaderProvider.loadClass
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:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:326)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:308)
... 10 more
We hacked it by adding an explicit import-package in the bundle of the proxy to 
com.foo since it is the package that contains SupportedCommand; it works, but 
maintaining an explicit list of import-packages is always a red-flag to me 
since it seems error-prone and a pain to maintain in the long run. So I’m 
wondering what is the clean way to do this. It seems that the model of static 
import-package doesn’t work well in such a bundle (i.e. the bundle that 
contains and RMI proxy which should be allowed to know any class that might 
come via RMI), is this a justified case for a dynamicImport-package or is there 
a better idiom for these cases??

I would appreciate any thoughts on this, how have others solved this issue?

Thank you,

Alejandro


DISCLAIMER: Privileged and/or Confidential information may be contained in this 
message. If you are not the addressee of this message, you may not copy, use or 
deliver this message to anyone. In such event, you should destroy the message 
and kindly notify the sender by reply e-mail. It is understood that opinions or 
conclusions that do not relate to the official business of the company are 
neither given nor endorsed by the company. Thank You.

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org<mailto:osgi-dev@mail.osgi.org>
https://mail.osgi.org/mailman/listinfo/osgi-dev


_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org<mailto:osgi-dev@mail.osgi.org>
https://mail.osgi.org/mailman/listinfo/osgi-dev



--
Raymond Augé<http://www.liferay.com/web/raymond.auge/profile> (@rotty3000)
Senior Software Architect Liferay, Inc.<http://www.liferay.com> (@Liferay)
Board Member & EEG Co-Chair, OSGi Alliance<http://osgi.org> (@OSGiAlliance)

DISCLAIMER:
Privileged and/or Confidential information may be contained in this
message. If you are not the addressee of this message, you may not
copy, use or deliver this message to anyone. In such event, you
should destroy the message and kindly notify the sender by reply
e-mail. It is understood that opinions or conclusions that do not
relate to the official business of the company are neither given
nor endorsed by the company.
Thank You.
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to