rmi 调试出错 java.rmi.UnmarshalException: error unmarshalling arguments

fengyoujie 2008-11-06 11:44:03
我在网上下载一个学习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

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



...全文
9333 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxzhoupeng 2012-08-20
  • 打赏
  • 举报
回复
你好! 我也遇到了同样的问题,能不能详述下你解决的办法! 谢谢!!!
lxzhoupeng 2012-08-20
  • 打赏
  • 举报
回复
你好! 我也遇到了同样的问题,能不能详述下你解决的办法! 谢谢!!!
bingtr 2011-03-22
  • 打赏
  • 举报
回复
遇到了同样的问题
forever_jofyul 2010-12-17
  • 打赏
  • 举报
回复
11楼说的很对。。解答了我的问题。非常感谢。
aquamarine147 2010-11-26
  • 打赏
  • 举报
回复
CalculatorImpl_Stub.class和CalculatorImpl.java虽然位于同一个路径下,但是CalculatorImpl_Stub并非由CalculatorImpl执行行直接加载,而是CalculatorImpl在向RMI注册时,要求rmiregistry去加载 CalculatorImpl_Stub类的,理解了这一层次上的意义就会知道其实 CalculatorImpl_Stub是为 rmiregistry所用的。所以解决办法是:
(1) 在执行 rmiregistry 之前,设置classpath让能查找到CalculatorImpl_Stub类,在同一Dos窗口中
C:\Documents and Settings\unmi>set classpath=%classpath%;D:\rmiDemo
C:\Documents and Settings\unmi>rmiregistry

(2) 或者在命令行中先进入到CalculatorImpl_Stub类所在的目录,然后再执行 rmiregistry (这种方法实质是与上面一样的,只是恰当的应用的classpath中的当前目录 "." ),
aquamarine147 2010-11-25
  • 打赏
  • 举报
回复
今天刚遇到了同样的问题 2L说的不对
出现这个问题的原因是classpath设置的问题
将放置stub的路径添加到classpath中即可
asd289974651 2010-11-25
  • 打赏
  • 举报
回复
顶。。。。
xkaaron 2010-10-14
  • 打赏
  • 举报
回复
要回复啊
PhilosNix 2010-10-11
  • 打赏
  • 举报
回复
遇到了相同问题,忘解释一下2楼
netcat1984 2010-03-16
  • 打赏
  • 举报
回复
看一下是什么问题!!
Technology_What 2010-03-11
  • 打赏
  • 举报
回复
楼主,能告诉我你怎么解决的吗?我也出现了同样的问题
cerlcen 2010-03-10
  • 打赏
  • 举报
回复
看看解决方案,我也遇到同样的问题
hahahappy1986 2009-08-19
  • 打赏
  • 举报
回复
楼上哥们能说下你怎么弄啊哦的吗?
fengyoujie 2008-11-08
  • 打赏
  • 举报
回复
谢谢楼上的那我大哥,不知道是什么原因,现在好了。
hakerivan 2008-11-06
  • 打赏
  • 举报
回复
java.lang.ClassNotFoundException: CalculatorImpl_Stub
是不是没有编译生成CalculatorImpl_Stub 这个文件,
建议:rmic -vcompat CalculatorImpl

主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。JavaRMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构中立的:Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧