Clojure 1.2.1 / 1.3 / 1.4 'Grails 2.0.0 런타임에서 생성 된 프록시가 실패합니다. 1.2.0은 괜찮습니다


103

Grails 2.0.0 (및 2.1.0-SNAPSHOT) 에서 Grails Clojure 플러그인 을 확장하는 중이며 Clojure 1.3.0 으로 업데이트하고 clojure.tools.logging을 추가하고 싶었습니다 .

Clojure는 in 의 로그 스트림 함수의 프록시 를 컴파일하는 동안 예외를 throw합니다 .ByteArrayOutputStreamclojure.tools.logging

ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn

( https://gist.github.com/a6ae681c37091a3d2379 )

나는 가서 제거 clojure.tools.logging하고 다음의 프록시 를 썼습니다 Object.

(proxy [java.lang.Object] [] (toString [] "proxy's toString"))

그리고 그것은 또한 똑같은 ClassCastException메시지를 던졌습니다 .

나는 인쇄하려 macroexpand-1프록시 와 같은 일을 얻었다.

Clojure 1.2.0으로 되 돌렸고 프록시가 다시 정상적으로 작동했습니다.

1.4.0의 여러 화신을 시도했는데 1.3.0과 동일한 동작을 나타냅니다. 1.2.1도 어떤 종류의 예외를 던지지 만 1.3.0을 맞추려고해서 많은 시간을 보내지 않았습니다.

'세대 방식의 함수의 스택 트레이스 포인트 중 하나에 정의 된 하자의 형태 generate-proxy에서 core_proxy.clj.

나는 println무슨 일이 일어나고 있는지 잡을 수 있는지 확인하기 위해 주변 에의 작은 얼룩을 추가했습니다 . 아마도이 다음 진술은 독자에 대한 오해를 배반 할 것입니다. 그러나 단순히 그것들을 추가 println하면 내가 완전히 예상하지 못했던 방식으로 컴파일 시간 동작이 변경되었습니다. 모든 Clojure 테스트가 mvn package계속 통과 하더라도 예외 위치와 예외 유형이 완전히 변경되었습니다 .

예를 들어, println바이트 코드 생성을 시작하기 직전에 gen-method에 단일 메서드를 추가하면 Clojure가

ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

( https://gist.github.com/5a7a40929a6c4a104bd5 )

나는 println(s) 를 어디에 두 었는지에 따라 다양한 다른 오류를 보았지만 이것이 가장 널리 퍼져 있습니다.

분명히 Grails와 Clojure의 일부 측면이 여기서 올바르게 맞물리지 않지만 연결이 보이지 않습니다. 처음에는 ASM 비 호환성이 의심되었지만 Clojure가 자체 ASM 네임 스페이스를 가지고 있기 때문에 문제가되는 것을 알 수 없습니다. 그러나 아마도 내가 틀렸을 수도 있습니다. 나는 며칠 동안 clojure.lang.Compiler, proxygenerate-proxy 를 쳐다보고 있으며 지금이 작동하도록 노력하고 있으며 증기가 없어서 앞으로 진행하는 것을 거의 중단했습니다.

링크 부족에 대해 사과드립니다. 아래에서 복사하여 붙여 넣을 수 있습니다.

Grails Clojure-github.com/grails-plugins/grails-clojure

Clojure 도구 로깅 -github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj 라인 133은 '프록시


4
좀 더 많은 테스트를 해봤지만 Grails 2.0에서 Clojure 1.3이 의존하는 무언가를 파괴하고 있다고 확신했습니다. Grails 1.3.7, Groovy 1.8.4 (Grails 2.0이 사용하는 것) 및 Groovy 1.8.5 (최신 버전)에서 생각할 수있는 가장 간단한 코드 샘플을 테스트했으며 모두 작동합니다.
John Courtland

3
이것이 ClassLoader 문제 일 수 있습니까?
Jeremy

답변:


4

나는라는 문제 발견 CLJ-944clojure.org을 . ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class문제에 대한 해결책을 찾을 수 있습니다.

문제는:

컴파일러가 clojure.lang.PersistentHashMap에 잘못된 캐스트를 주입합니다. 이 경우 .containsKey 메서드를 사용하는 가장 일반적인 인터페이스 인 clojure.lang.Associative로 캐스팅되어야합니다.

패치 1-0001-Fix-for-CLJ-944.patch

패치 2-0002-Fix-for-CLJ-944.patch

도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.