2013-08-21 2 views
1

릴리스 정보는 RMI와 관련된 변경 지정 변경 :JDK7u21 RMI는 JDK7u21의

이 릴리스에서을의 RMI 재산 java.rmi.server.useCodebaseOnly은 기본적으로 true로 세트입니다. 이전 릴리스에서 기본값은 false입니다.

이 기본값 변경으로 RMI 기반 응용 프로그램이 예기치 않게 을 나눌 수 있습니다. 일반적인 증상은 java.rmi.UnmarshalException (중첩 된 java.lang.ClassNotFoundException 포함)을 포함하는 스택 추적입니다.

이러한 예외가 발생하면, 문제를 해결하기 위해 선호하는 방법은 가 가 java.rmi.server.codebase에 시스템 속성에 적절한 값을 지정하여, 동일한 코드베이스를 사용하는 모든 RMI 클라이언트와 서버를 구성하는 것입니다. 이는 일반적으로 응용 프로그램을 시작하는 명령에 -D 옵션을 추가하여 수행합니다. java -Djava.rmi.server.codebase = file : //// (path-to-remote-classes)/

here 설명서에 java.rmi.server.useCodebaseOnly 속성을 false로 다시 설정하는 것이 좋습니다.

그러나이 속성을 false로 명시 적으로 설정하더라도 위에 언급 한 예외가 발생합니다. 여기 어떤 단서를 주시겠습니까?

위에서 설명한 기본 방법으로 해결해야하는 경우 (-Djava.rmi.server.codebase = file : //// (path-to-remote-classes) /를 설정하여/여기에 설정해야합니까? 내 작업 공간/bin

+0

누군가 도와 드릴 수 있습니까? – ParagJ

답변

0

죄송합니다. 혼자서 해결했습니다. 문제는 내 .ksh 파일에 전달 된 매개 변수의 수가 잘못되었습니다. 이로 인해 RMI 레지스트리가 시작되는 문제가 발생했습니다.

2

RMI 서버, RMI 클라이언트, RMI 레지스트리를 포함하여 모든 원격 JVM에서 속성을 설정해야합니다. 같은 컴퓨터에 모두있는 경우 java.rmi.server.codebase을 모두 입력하고 file: URL을 사용하여 클래스 위치를 가리키게 할 수 있습니다. 동일한 컴퓨터에 있지 않은 경우 클래스를 사용하여 클래스를 사용할 수 있습니다. HTTP 서버로 복사 한 다음 원격 JVM의 코드베이스 속성을 설정합니다 (pres 어쩌면 클라이언트)는 클래스가 사용 가능한 곳을 가리키는 http: URL을 사용합니다. 또는 코드를 복사하거나 공유 파일 시스템을 사용하는 등의 다른 방법을 통해 원격 JVM에서 클래스를 사용할 수있게 만든 다음 codebase 속성을 file: URL로 설정할 수 있습니다.

java.rmi.server.useCodebaseOnlyfalse으로 설정하는 해결 방법을 적용하는 데는 몇 가지 이유가있을 수 있습니다. 즉, 상호 작용하는 모든 JVM에서 설정하지 않았거나 코드베이스 속성을 올바른 값으로 설정하지 않았을 수 있습니다. . 레지스트리를 구성하는 문제가 모든 클라이언트에 갈 필요하고 있기 때문에, 당신은뿐만 아니라 올바른 URL에 자신의 codebase 속성을 설정하는 대신 falseuseCodebaseOnly을 설정하는 해결 방법을 추구 추구 할 수

.

+0

상세한 통찰력에 감사드립니다. java.rmi.server.useCodebaseOnly 속성을 System.setProperty() 메서드를 사용하여 false로 올바르게 설정하고 JVM으로 -D 스위치를 사용하여 시도했다. 그러나 그것은 효과가 없습니다. – ParagJ

+0

또한 RMI 서버, 클라이언트 및 레지스트리는 모두 동일한 컴퓨터에 있습니다. 그래서이 코드베이스를 지정하려고했습니다 -Djava.rmi.server.codebase = file :/C :/ICS/bin. 이 구문이 정확합니까? 왜냐하면 그것을 고치지 않았기 때문입니다. – ParagJ

+0

가장 큰 문제는 rmiregistry가 클래스를 볼 수 없다는 것입니다. 레지스트리 JVM에 codebase 속성을 설정해야합니다. 레지스트리의 등록 정보를 설정하려면 -D 옵션 앞에 -J를 붙여야합니다. 또한 URL 구문이 잘못되었습니다. 로컬 파일에는 세 개의 선행 슬래시가 있어야하고 디렉토리를 가리키는 경우에는 슬래시가 있어야합니다. 명령은'rmiregistry -J-Djava.rmi.server.codebase = file : /// C :/ICS/bin /'와 같아야합니다. 클라이언트의 경우 가장 간단한 것은 클래스 경로에 필요한 클래스를 추가하는 것입니다. –

0

당신은 필요 하나에 : 그 java.rmi.server.codebase을 위해 다운로드 수업을하고, JVM (들) 객체 클래스를 보내 모두의 JVM에서 사용 가능한 것으로 설정되어 전혀 false

  1. 설정을

  2. 시스템에있는 모든 JVM이 해당 JVM에 사용할 수있는 코드베이스를 가리키는 java.rmi.server.codebase 속성으로 시작되었는지 확인하십시오.

매우 이상한 변화입니다. 보안 상 함의는 없지만 모든 코드베이스 수신자에서 의미를 변경하는 성가신 변화입니다. useCodebaseOnly=true을 사용하는 경우 JVM에서 java.rmi.server.codebase을 설정해야합니다. 그렇지 않으면 전송 JVM에서만 설정하면됩니다. 이것은 문서에서 명확하지 않습니다.

+0

[이 취약점] (https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1537)에 대한 응답 인 것으로 보입니다. 속성을 false로 다시 설정하는 것은주의해서 수행해야합니다. – mins