これはかなり簡単だと思いますが、私はかなりJavaに慣れています(私は.NETの少年です:P)。ここでは成功には至っていないと思います。java rmi単純なプロジェクトclassNotFoundExceptionバインディングレジストリ
私は、クライアント、サーバー、共通のプロジェクトが定義されている共通のプロジェクトで簡単な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値をコンソールに出力しました、そして、それはIReguladorインタフェースが定義されているプロジェクトのbinフォルダを指しています。 (ファイル:/ F:/ Practicas%20Y%20dem%C3%A1S/SISTEMAS%20Distribuidos /共通/ binに/)
- もちろん、そのプロジェクトは、サーバープロジェクト (Regulador)
- ワークスペースのクラスパスに設定されていますrmiregistryは異なるディスク上にある
- UtilsクラスはIReguladorインターフェイスと同じプロジェクトにあり、例外がスローされる前に実行されるため(java.rmi.serverなど)、グローバルクラスパスの問題には見えません。コードベースが正しく設定されています)。
私は(それが直接、いくつかの答えにがっかりしているが)、それを呼び出す前のrmiregistryのクラスパスを設定しようとしたが、何も変わっていません。 Reguladorプロジェクトのbinフォルダからrmiregistry.exeを起動しようとしましたが、何も変更していないようです。
.NETの背景から来ていますが、私はいつもこれらのクラスパスの問題が混乱していることを発見しました。この1つは、それが当然だと思うよりはるかに多くの時間を消費し始めています。私は助けが切望されている。
UPDATE:問題は、IRegulador.classのコードベースに渡されたURL内にあると考え始めました。 Windowsエクスプローラに貼り付けると、SOがそれを見つけることができないので、レジストリがルートに到達するのを防ぐレジストリの構造上の問題があります。
file:/ F:/ Practicas%20y%私はパスのルートが複雑すぎると思っていたので、単純化して直進性のない文字から削除しました。/ F:/ Practicas/SD /共通/ binに/
問題が解決しないただしのrmiregistryがそのフォルダに到達することができない理由は、私にはわからない今、コードベース値は
ファイルです。
次に、プロジェクト全体をrmiregistryが実行されているディスクに移動し、何か変更があるかどうかを確認することにしました。しかし、何も変わっていない、同じ問題。