Java 远程对象中 javax.json.JsonValue 的 RMI NoClassDefFoundError
Java RMI NoClassDefFoundError for javax.json.JsonValue in Remote object
运行 进入调用 UnicastRemoteObject.exportObject().
期间导致的异常
javax.json.jar在类路径上,在应用程序的许多其他地方使用都没有任何问题。
应用程序的这一部分工作正常,直到我添加了一个将 JsonValue 返回到远程对象的方法。
有什么想法吗?
java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.NoClassDefFoundError: javax/json/JsonValue
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:416)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport.run(Transport.java:177)
at sun.rmi.transport.Transport.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
注意:
我还尝试了 运行 代码库直接指向 javax.json.jar 的 rmiregistry,但异常仍然存在
rmiregistry -J-Djava.rmi.server.codebase=file:///JarLibrary/javax.json.jar &
Running into Exception caused during call to UnicastRemoteObject.exportObject().
不,你不是。查看堆栈跟踪。它发生在 Registry.bind().
您需要 运行 服务器 与 java.rmi.server.codebase
属性 集,但是 file:// codebase URL 不会工作,除非所有客户端都在服务器主机中 运行ning,在这种情况下,您根本不需要代码库功能,或者它指向共享文件夹的形式Registry 和 clients 都可以使用。通常是 HTTP。
但我质疑您是否完全需要代码库功能。您只需确保相关的 jar 文件在注册表和客户端的 CLASSPATH 中。确保注册表的最简单方法是在服务器 JVM 中使用 LocateRegistry.createRegistry()
而不是外部 rmiregistry
程序。
我也想知道您为什么要使用 JSON。 RMI 建立在对象序列化之上。您不需要添加另一个序列化程序。
运行 进入调用 UnicastRemoteObject.exportObject().
javax.json.jar在类路径上,在应用程序的许多其他地方使用都没有任何问题。
应用程序的这一部分工作正常,直到我添加了一个将 JsonValue 返回到远程对象的方法。
有什么想法吗?
java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.NoClassDefFoundError: javax/json/JsonValue
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:416)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport.run(Transport.java:177)
at sun.rmi.transport.Transport.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
注意: 我还尝试了 运行 代码库直接指向 javax.json.jar 的 rmiregistry,但异常仍然存在
rmiregistry -J-Djava.rmi.server.codebase=file:///JarLibrary/javax.json.jar &
Running into Exception caused during call to
UnicastRemoteObject.exportObject().
不,你不是。查看堆栈跟踪。它发生在 Registry.bind().
您需要 运行 服务器 与 java.rmi.server.codebase
属性 集,但是 file:// codebase URL 不会工作,除非所有客户端都在服务器主机中 运行ning,在这种情况下,您根本不需要代码库功能,或者它指向共享文件夹的形式Registry 和 clients 都可以使用。通常是 HTTP。
但我质疑您是否完全需要代码库功能。您只需确保相关的 jar 文件在注册表和客户端的 CLASSPATH 中。确保注册表的最简单方法是在服务器 JVM 中使用 LocateRegistry.createRegistry()
而不是外部 rmiregistry
程序。
我也想知道您为什么要使用 JSON。 RMI 建立在对象序列化之上。您不需要添加另一个序列化程序。