2009-11-17 4 views
3

일부 공급 업체 제공된 소프트웨어에 "플러그인"을 구현하기 위해 clojure를 사용하려고합니다.clojure rmi classpath problem

다음은 공급 업체가 제공하는 소프트웨어에 대한 배경 지식입니다. 그것은 특정 인터페이스를 구현 한 다음 해당 구현을 포함하는 파일 을 서버의 디렉토리에 넣으려고합니다. 그런 다음 클라이언트가 소프트웨어를 실행하면 구현 된 클래스가 RMI를 통해 서버에 클라이언트에 "전송"되고 내 구현이 인 클라이언트에서 실행됩니다. 클라이언트에 내 jar 파일 (또는 clojure jar 파일)이 classpath에 없습니다. 서버에만 의 jar 파일이 있습니다. RMI는 종속성이 필요한 모든 것을 업로드 할 정도로 영리한 것 같습니다.

저는 clojure에서 매우 간단한 구현을 성공적으로 구현했으며 이 작동하는 것 같습니다. 문제는 클라이언트에서 즉시 구현을 업데이트 할 수 있기를 바랍니다. 내 클래스 에 repl-server를 내장했는데 성공적으로 연결할 수 있습니다. 그냥 분명히 repl-server가 클라이언트에서 실행 중이고 repl에 연결할 수 있는데 "clojure.core =>"프롬프트가 나타납니다. 그러나 repl는 인 것처럼 보입니다. 입력 (+ 1 1)하면 다음 오류가 발생합니다. "java.lang.ClassNotFoundException : clojure.lang.Numbers". (str "kent")을 입력하면 "java.lang.NoClassDefFoundError : clojure/lang/ AF 기능"이 표시됩니다. 내가 입력하는 대부분의 것들은 비슷한 것을 만들어 낸다. 나는 일 수 있지만 (def x 3)와 같은 간단한 def를 수행하면 x가 정의됩니다. REPL은 어떤 의미에서 실행되는 것처럼 보입니다. 이 클래스 경로에 문제가있을 수 있습니다처럼

보인다,하지만 REPL 동안 클라이언트에서 실행 내 "컴파일"코드가 클래스 경로 문제가 발생하지 왜 나는 캔트 찾을 같은 클라이언트에서 실행, 확실하지 않다 코어 클래스.

아이디어가 있으십니까?

감사합니다. 켄트.

답변

2

우선, RMI 클라이언트의 일부로 clojure.jar를 배포 할 수 있습니까? 공급 업체 소프트웨어에 대한 귀하의 설명을 토대로, 나는 대답이 '아니오'라고 추측합니다.

둘째, clojure.jar의 내용과 RMI 객체가 서버의 동일한 jar 파일에 있습니까? 아니면 둘 다 자신의 jar 파일에 있습니까?

그것은 클래스 로더 문제 일 가능성이 높습니다. Clojure에서 정의 된 각 함수는 자체 클래스 파일을 생성하고 Clojure는 특정 클래스 로더를 통해로드합니다. IIRC 각 함수는 자체 클래스 로더 인스턴스에 의해로드되어 재정의 된 경우 해당 함수를 가비지 수집 할 수 있습니다. 마찬가지로 RMI는 자체 클래스 로더를 사용하여 네트워크를 통해 원격 RMI 객체를로드합니다. 그래서 아마도 두 클래스 로더가 심하게 상호 작용할 수 있습니다. ... 좀 더 도움이 될 수 없습니다

죄송합니다

- 라 우리