首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

java.rmi.UnmarshalException: error unmarshalling arguments

2011-11-11 
rmi 调试出错 java.rmi.UnmarshalException: error unmarshalling arguments我在网上下载一个学习rmi的例

rmi 调试出错 java.rmi.UnmarshalException: error unmarshalling arguments
我在网上下载一个学习rmi的例子程序,调试很长时间也没有没有调通,追后的错误如下:
Trobulett:java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
  java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
  java.lang.ClassNotFoundException: CalculatorImpl_Stub
我在此对程序做个说明:
我将所有的文件保存在D:\rmiDemo这个目录下面总共有四个java文件:
1)接口 Calculator.java
import java.rmi.Remote;
public interface Calculator extends Remote{
  public long add(long a,long b)throws java.rmi.RemoteException;
  public long sub(long a,long b)throws java.rmi.RemoteException;
  public long mul(long a,long b)throws java.rmi.RemoteException;
  public long div(long a,long b)throws java.rmi.RemoteException;
}
2)接口的具体实现 CalculatorImpl.java

import java.rmi.server.UnicastRemoteObject;
public class CalculatorImpl extends UnicastRemoteObject implements Calculator{
  //这个实现必须有一个显示的构造函数,并且要抛出一个RemoteException异常
  public CalculatorImpl() throws java.rmi.RemoteException {
  super();
  }  
  public long add(long a,long b) throws java.rmi.RemoteException {
  return a+b;
  }  
  public long sub(long a,long b) throws java.rmi.RemoteException {
  return a-b;
  }  
  public long mul(long a,long b) throws java.rmi.RemoteException {
  return a*b;
  }  
  public long div(long a,long b) throws java.rmi.RemoteException {
  return a/b;
  }
}
3)客户端 CalculatorClient.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient{
  public static void main(String[] args){
  try{
  Calculator c = (Calculator)Naming.lookup("rmi://localhost/CalculatorService");
  System.out.println(c.sub(4,3));
  System.out.println(c.add(4,5));
  System.out.println(c.mul(3,6));
  System.out.println(c.div(9,3));
  }catch (MalformedURLException murle) {  
  System.out.println();  
  System.out.println( 
  "MalformedURLException");  
  System.out.println(murle);  
  }  
  catch (RemoteException re) {  
  System.out.println();  
  System.out.println( 
  "RemoteException");  
  System.out.println(re);  
  }  
  catch (NotBoundException nbe) {  
  System.out.println();  
  System.out.println( 
  "NotBoundException");  
  System.out.println(nbe);  
  }  
  catch ( 
  java.lang.ArithmeticException 
  ae) {  
  System.out.println();  
  System.out.println( 
  "java.lang.ArithmeticException");  
  System.out.println(ae);  
  } 
  }
}
4)主机服务器 CalculatorServer.java

import java.rmi.Naming;
//一个服务器类
public class CalculatorServer{
  public CalculatorServer(){
  try{
  Calculator c = new CalculatorImpl();
  Naming.rebind("rmi://localhost:1099/CalculatorService",c);  


  }catch(Exception e){
  System.out.println("Trobulett:"+e);
  }
  }
  public static void main(String args[]){
  new CalculatorServer();
  }
}

就是这四个文件,实现一个简单的分布式计算。
第一步:我在命令行编译都通过了:d:\rmiDemo> javac *.java 分别生成相应的.class文件
第二步:使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
  d:\rmiDemo> rmic CalculatorImpl
第三步:运行RMI系统 d:\rmiDemo> rmiregistry

第四步:d:\rmiDemo> java -Djava.security.policy=policy.txt CalculatorServer 
policy.txt 的内容如下:
grant {
permission java.security.AllPermission "", "";
};
前三步我都能顺利通过。也生成了CalculatorImpl_Stub.class 文件。但是运行第四步的时候,出现错误:
D:\rmiDemo>java -Djava.security.policy=policy.txt CalculatorServer
Trobulett:java.rmi.ServerException: RemoteException occurred in server thread; n
ested exception is:
  java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
  java.lang.ClassNotFoundException: CalculatorImpl_Stub



我的classpath设置为:
classpath=.;D:\Program Files\Java\jdk1.5.0_16\lib;D:\Program Files\Java\jdk1.5.0_16\lib\dt.jar;D:\Program Files\Java\jdk1.5.0_16\lib\tools.jar

请问各位指点一下,非常感谢。





[解决办法]
java.lang.ClassNotFoundException: CalculatorImpl_Stub 
 是不是没有编译生成CalculatorImpl_Stub 这个文件,
建议:rmic -vcompat CalculatorImpl

热点排行