java rmi简单项目classNotFoundException绑定注册表

时间:2017-11-09 18:49:42

标签: java eclipse classpath rmi rmiregistry

好的,我确定这应该很简单,但我对Java很新(我更像是一个.NET男孩:P)并且按照我在这里找到的每一条建议都没有成功,我认为是时候退后一步了。

我正在尝试使用客户端,服务器和定义公共接口的公共项目来启动一个简单的rmi项目。我刚刚实现了我的服务器代码,当我尝试运行它以检查一切是否正常时,我会遇到java.lang.ClassNotFoundException。

在关于类似问题的几个答案之后,我很确定我的问题来自于在我的项目之外的其他地方运行的rmiregistry。

我使用以下代码设置注册表代码库:

public class Utils {

public static final String CODEBASE = "java.rmi.server.codebase";

public static void setCodeBase(Class<?> c) {
    String ruta = c.getProtectionDomain().getCodeSource().getLocation().toString();

    String path = System.getProperty(CODEBASE);
    if (path != null && !path.isEmpty()) {
        ruta = path + " " + ruta;
    }

    System.setProperty(CODEBASE, ruta);
}

}

然后,我尝试用这个主类启动我的服务器代码:

public class MainRegulador {

public static void main(String[] args) throws AccessException, RemoteException, NotBoundException {

    Utils.setCodeBase(IRegulador.class);
    Registry registro = null;
    Remote proxy = null;

    try {

        Regulador myReg = new Regulador();
        proxy = UnicastRemoteObject.exportObject(myReg, 36510);

        registro = LocateRegistry.getRegistry();
        registro.rebind("Distribuidor", proxy);  //this is the line where exception is thrown

        System.out.println("El Regulador está corriendo. Pulse ENTER para finalizar el proceso.");
        System.in.read();

    } catch(Exception ex) {

        System.out.println("No se ha logrado inicializar el Registrador");
        System.out.println(ex.getMessage());

    } finally {

        if (registro != null && proxy != null) {
            registro.unbind("Distribuidor");
            UnicastRemoteObject.unexportObject(proxy, true);
        }

    }
}

}

但是当我运行它时,总是在IRegulador接口处获得java.lang.ClassNotFoundException。

现在有趣的部分:

  • 我已经打印到控制台java.rmi.server.codebase值,它指向项目的bin文件夹,其中定义了IRegulador接口。 (文件:/ F:/ Practicas%20Y%20dem%C3%A1S / Sistemas公司%20Distribuidos /普通/斌/)
  • 显然,该项目也在服务器项目的类路径中设置 (Regulador)
  • Workspace和rmiregistry位于不同的磁盘上
  • 尽管如此,它似乎不是一个全局类路径问题,因为Utils类与IRegulador接口在同一个项目上,并且它在抛出异常之前运行(正确设置了java.rmi.server.codebase)。

我在调用之前尝试设置rmiregistry的类路径(尽管在某些答案中直接劝阻),但没有任何改变。 我也尝试从Regulador项目bin文件夹启动rmiregistry.exe,但似乎也没有改变任何东西。

来自.NET背景,我总是发现这些类路径问题令人困惑,而且这个问题开始耗费的时间远远超过我怀疑它应得的时间。我迫切需要帮助。

更新:我开始认为问题在于它从IRegulador.class传递给代码库的URL中。如果我将它粘贴到Windows资源管理器中,SO无法找到它,所以我认为它正在构建时会出现一些阻止注册表到达路径的结构问题:

文件:/ F:/ Practicas%20Y%20dem%C3%A1S / Sistemas公司%20Distribuidos /普通/斌/

UPDATE2:我认为路径路径可能过于复杂,所以我决定简化它并将其从任何非直线字符中删除。现在代码库值是

文件:/ F:/ Practicas / SD /普通/斌/

然而问题仍然存在,我不知道为什么rmiregistry无法访问该文件夹。

然后我决定将整个项目移动到执行rmiregistry的同一个磁盘上,看看它是否发生了变化。但没有改变,同样的问题。

1 个答案:

答案 0 :(得分:0)

好的,最后我开始工作......

我刚刚将rmiregistry.exe复制到common / bin文件夹中并直接从那里启动它(以前只是从那里调用过)。

这似乎解决了路由的问题(实际上它使路由可用于注册表,因为它在同一个文件夹上,可能我所有的代码库编写代码现在都是超级的。)