Java 无法启动RMI Fibonacci服务器

Java 无法启动RMI Fibonacci服务器,java,rmi,fibonacci,java-server,Java,Rmi,Fibonacci,Java Server,我正在学习JavaRMI,我已经创建了一个非常简单的服务器来计算斐波那契数。服务器(FibonacciServer)创建一个负责计算序列的对象(Fibonacci),该对象实现一个接口(IFibonacci): FibonacciServer.java: package myrmifibonacciserver; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteExcept

我正在学习JavaRMI,我已经创建了一个非常简单的服务器来计算斐波那契数。服务器(FibonacciServer)创建一个负责计算序列的对象(Fibonacci),该对象实现一个接口(IFibonacci):

FibonacciServer.java:

package myrmifibonacciserver;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class FibonacciServer {
    public static void main(String args[]){
        try{
            Fibonacci fib = new Fibonacci();
            Naming.rebind("fibonacci", fib);
            System.out.println("Fibonacci Server ready.");
        }catch(RemoteException rex){
            System.err.println("Exception in Fibonacci.main " + rex);
        } catch (MalformedURLException ex) {
            System.err.println("MalformedURLException " + ex);
        }
    }
}
package myrmifibonacciserver;

import java.math.BigInteger;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Fibonacci extends UnicastRemoteObject implements IFibonacci{

    private static final long serialVersionUID = -4300545841720809981L;

    public Fibonacci() throws RemoteException{
        super();
    }

    @Override
    public BigInteger getFibonacci(int n) throws RemoteException {
        return getFibonacci(new BigInteger(Long.toString(n)));
    }

    @Override
    public BigInteger getFibonacci(BigInteger n) throws RemoteException {
        System.out.println("Calculating teh " + n + "th Fibonacci number");
        BigInteger zero = BigInteger.ZERO;
        BigInteger one = BigInteger.ONE;

        if(n.equals(zero) || n.equals(one)) 
            return one;

        BigInteger current = one;
        BigInteger low = one;
        BigInteger high = one;
        BigInteger temp;

        while(current.compareTo(n) == -1){
            temp = high;
            high = high.add(low);
            low = temp;
            current = current.add(one);
        }
        return high;
    }

}
package myrmifibonacciserver;

import java.math.BigInteger;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IFibonacci extends Remote{
    public BigInteger getFibonacci(int n) throws RemoteException;
    public BigInteger getFibonacci(BigInteger n) throws RemoteException;
}
斐波那契:

package myrmifibonacciserver;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class FibonacciServer {
    public static void main(String args[]){
        try{
            Fibonacci fib = new Fibonacci();
            Naming.rebind("fibonacci", fib);
            System.out.println("Fibonacci Server ready.");
        }catch(RemoteException rex){
            System.err.println("Exception in Fibonacci.main " + rex);
        } catch (MalformedURLException ex) {
            System.err.println("MalformedURLException " + ex);
        }
    }
}
package myrmifibonacciserver;

import java.math.BigInteger;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Fibonacci extends UnicastRemoteObject implements IFibonacci{

    private static final long serialVersionUID = -4300545841720809981L;

    public Fibonacci() throws RemoteException{
        super();
    }

    @Override
    public BigInteger getFibonacci(int n) throws RemoteException {
        return getFibonacci(new BigInteger(Long.toString(n)));
    }

    @Override
    public BigInteger getFibonacci(BigInteger n) throws RemoteException {
        System.out.println("Calculating teh " + n + "th Fibonacci number");
        BigInteger zero = BigInteger.ZERO;
        BigInteger one = BigInteger.ONE;

        if(n.equals(zero) || n.equals(one)) 
            return one;

        BigInteger current = one;
        BigInteger low = one;
        BigInteger high = one;
        BigInteger temp;

        while(current.compareTo(n) == -1){
            temp = high;
            high = high.add(low);
            low = temp;
            current = current.add(one);
        }
        return high;
    }

}
package myrmifibonacciserver;

import java.math.BigInteger;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IFibonacci extends Remote{
    public BigInteger getFibonacci(int n) throws RemoteException;
    public BigInteger getFibonacci(BigInteger n) throws RemoteException;
}
IFibonacci:

package myrmifibonacciserver;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class FibonacciServer {
    public static void main(String args[]){
        try{
            Fibonacci fib = new Fibonacci();
            Naming.rebind("fibonacci", fib);
            System.out.println("Fibonacci Server ready.");
        }catch(RemoteException rex){
            System.err.println("Exception in Fibonacci.main " + rex);
        } catch (MalformedURLException ex) {
            System.err.println("MalformedURLException " + ex);
        }
    }
}
package myrmifibonacciserver;

import java.math.BigInteger;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Fibonacci extends UnicastRemoteObject implements IFibonacci{

    private static final long serialVersionUID = -4300545841720809981L;

    public Fibonacci() throws RemoteException{
        super();
    }

    @Override
    public BigInteger getFibonacci(int n) throws RemoteException {
        return getFibonacci(new BigInteger(Long.toString(n)));
    }

    @Override
    public BigInteger getFibonacci(BigInteger n) throws RemoteException {
        System.out.println("Calculating teh " + n + "th Fibonacci number");
        BigInteger zero = BigInteger.ZERO;
        BigInteger one = BigInteger.ONE;

        if(n.equals(zero) || n.equals(one)) 
            return one;

        BigInteger current = one;
        BigInteger low = one;
        BigInteger high = one;
        BigInteger temp;

        while(current.compareTo(n) == -1){
            temp = high;
            high = high.add(low);
            low = temp;
            current = current.add(one);
        }
        return high;
    }

}
package myrmifibonacciserver;

import java.math.BigInteger;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IFibonacci extends Remote{
    public BigInteger getFibonacci(int n) throws RemoteException;
    public BigInteger getFibonacci(BigInteger n) throws RemoteException;
}
如您所见,这是一个非常基本的示例。我使用命令
rmiregistry&
在linux上启动RMI注册表,它启动时没有问题

但是,当我单击run按钮(在Eclipse或Netbeans中)运行我的小项目时,我得到一个错误:

Exception in Fibonacci.main java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: myrmifibonacciserver.IFibonacci
我不知道为什么!
起初我认为这是因为存根,但由于我使用的是Java1.7,所以这些存根是自动创建的。我做错了什么?

没有找到代码库。原因是,从JDK 7开始,java.rmi.server.useCodebaseOnly属性默认为true,而在以前的版本中,默认为false

当属性为false时,它将使用服务器的代码库,但在true情况下,它将忽略它


您的问题将在较低的JDK中解决。ex
JDK6

注册表的类路径上没有可用的命名类和/或您没有正确设置代码库(如果有的话)。您不必使用代码库特性,但如果您这样做,它必须是正确的。解决这个问题的一个更简单的方法可能是通过LocateRegistry.createRegistry()在服务器JVM中启动注册表。

我已经在Eclipse和Netbeans的VM参数中添加了
-Djava.rmi.server.useCodebaseOnly=false
选项,但是当我尝试运行时仍然会遇到相同的错误:SYes,代码库似乎是问题所在,我只是无法修正:我在你的问题中没有看到任何证据表明你在使用它。如果你是,你需要说明你是如何定义它的。在你的问题中。我将创建一个新问题来尝试解决这个问题,但谢谢!除非你想让它关闭,否则不要这样做。同样的问题,同样的答案。您根本没有使用代码库功能。试试上面的建议。我不想使用代码库,这就是重点。我现在正在使用安全管理器!威伊!仅此一点,问题就大不相同了!