좋아,이 꽤 쉬워야한다고 확신하지만, 나는 Java에 상당히 익숙하다 (나는 .NET Boy : P 다). 그리고 내가 찾은 모든 추천을 따랐다. 여기에 아무런 성공도없이, 나는 물러서서 물어볼 시간이라고 생각합니다.자바 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/일반/빈 /)
- 물론, 해당 프로젝트는 또한 서버 프로젝트 (Regulador)
- 작업 영역의 클래스 경로 설정 rmiregistry는 다른 디스크에 있습니다.
- Utils 클래스는 IRegulador 인터페이스와 동일한 프로젝트에 있으며 예외가 발생하기 전에 실행되기 때문에 (java.rmi.server처럼) 전역 클래스 경로 문제는 아닙니다. 코드베이스가 올바르게 설정되어 있습니다).
나는 그것을 호출하기 전에 rmiregistry의 classpath를 설정하려고 시도했으나 (어떤 답변에서는 직접적으로 권장하지 않지만), 아무 것도 변경되지 않았습니다. Regulador 프로젝트 bin 폴더에서 rmiregistry.exe를 시작하려고했지만 아무 것도 변경하지 않은 것으로 보입니다.
.NET 배경에서 볼 때이 클래스 경로 문제가 혼란 스럽다는 것을 알았습니다.이 클래스 경로 문제는 가치가 있다고 생각되는 것보다 훨씬 많은 시간을 소비하기 시작했습니다. 나는 절망적 인 도움이 필요하다.
업데이트 : 문제가 URL 내에 있다고 생각하기 시작했습니다. IRegulador.class의 코드베이스에 전달되었습니다. Windows 탐색기에 붙여 넣기 만하면 찾을 수 없으므로 레지스트리가 경로에 도달하지 못하게하는 일부 구조 문제로 인해 빌드 중입니다.
file :/F :/Practicas % 20y % 20.0 % c3 % a1s/Sistemas % 20Distribuidos/common/bin/
UPDATE2 : 경로 경로가 너무 복잡 할 수 있다고 생각하여 단순화하고 직선이 아닌 문자를 제거하기로 결정했습니다.이제 코드베이스 값이
파일은 다음과 같습니다/F : rmiregistry의 해당 폴더에 도달 할 수없는 이유/Practicas/SD/일반/빈은/문제가 계속하지만
, 나는 모른다.그런 다음 전체 프로젝트를 rmiregistry가 실행되는 동일한 디스크로 이동하고 변경 사항이 있는지 확인하기로 결정했습니다. 그러나 아무것도 바뀌지 않았고 똑같은 문제가있었습니다.