問題は非常に人気があるようです-> Eclipse IDEを使用してRMIサーバーを実行しているときにClassNotFoundException ...確かに、http://www.genady.netからRMI Eclipseプラグインでコードベースパラメーターを設定するあらゆる可能な方法を深く掘り下げました何も機能しませんでしたそのコードをSERVERのメインで:
try{
Registry r = LocateRegistry.getRegistry(1099);
r.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
または、1099 で RMIRegistry が事前に開始されている場合:
try{
Naming.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
Server Impl Stub に関しては ClassNotFound ... 何時間も髪を抜いた後、try ブロックにレジストリを作成し、それを使用してサーバーを登録することにしました。
try{
Registry r = LocateRegistry.createRegistry(1099);
Naming.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
出来た!!!素晴らしいですが、クライアントの実行よりもこれが生成されました:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: demo.rmi.print.server.RemotePrinterImpl_Stub
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at demo.rmi.print.client.PrintClient.main(PrintClient.java:15)
Caused by: java.lang.ClassNotFoundException: demo.rmi.print.server.RemotePrinterImpl_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:424)
at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1208)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:454)
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:222)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
... 3 more
そして、私は何をすべきか少しもわかりません.RMIRegistryはどういうわけか台無しになっていますか? コードのせいですか?
できれば助けてください。
ここにコード、print-server、print-client、print-common ( with shared Interface ) があります:
package demo.rmi.print.common;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemotePrinter extends Remote {
public String getPrinterStatus() throws RemoteException;
}
/////////////////////////////////////////////// ////
package demo.rmi.print.server;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import demo.rmi.print.common.RemotePrinter;
public class RemotePrinterImpl extends UnicastRemoteObject implements
RemotePrinter {
public RemotePrinterImpl() throws RemoteException{
super();
}
@Override
public String getPrinterStatus() throws RemoteException {
System.out.println("Requested STATUS?");
return "OK";
}
public static void main(String[] args) {
try{
Registry r = LocateRegistry.createRegistry(1099);
r.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
}
}
/////////////////////////////////////////////// ////
package demo.rmi.print.client;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import demo.rmi.print.common.RemotePrinter;
public class PrintClient {
public static void main(String[] args) {
System.setSecurityManager(new RMISecurityManager());
try{
RemotePrinter printer = (RemotePrinter) Naming.lookup("SERVER");
printer.getPrinterStatus();
}catch(Exception e){
e.printStackTrace();
}
}
}
私はいくつかの良いアドバイスを頼りにしています!
前もって感謝します、