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


Answers

Question

나는 Grails 2.0.0 (그리고 2.1.0-SNAPSHOT)에서 Grails Clojure 플러그인 을 확장하려고하고 있는데, 이것을 Clojure 1.3.0 으로 업데이트하고 clojure.tools.logging 추가하려고했다.

Clojure는 clojure.tools.logging 의 로그 스트림 함수에서 ByteArrayOutputStream프록시 를 컴파일하는 동안 예외를 발생시킵니다.

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을 치려고 했으므로 시간 낭비하지 않았습니다.

스택 추적은 core_proxy.cljgenerate-proxy 형식 중 하나에 정의 된 gen 메소드 함수를 가리 킵니다.

나는 일어나고있는 것을 잡을 수 있는지보기 위해 그 주변에 println 의 작은 겉 핥기를 덧붙였다. 어쩌면이 다음 문장은 독자의 커다란 오해를 배반 할 것입니다. 그러나 단순히 println 추가하면 완전히 예상하지 못한 방식으로 컴파일 시간 동작이 변경됩니다. mvn package 모든 Clojure 테스트가 계속 통과하더라도 예외 위치 및 예외 유형이 완전히 변경되었습니다.

예를 들어, bytecode 생성을 시작하기 전에 gen 메소드에 하나의 println 을 추가하기 만하면 Clojure가 throw됩니다.

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

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

나는 println (s)을 어디에 두 println 에 따라 여러 가지 다른 에러를 보았다. 그러나 이것이 가장 보편적이다.

분명히 Grails와 Clojure의 일부 측면은 여기에서 정확하게 맞물리지 않지만 연결이 보이지 않습니다. 처음에는 ASM 비 호환성을 의심했지만 Clojure 자체 ASM 네임 스페이스가 있기 때문에 이것이 문제라는 것을 알 수 없습니다. 하지만 어쩌면 내가 틀렸어. 나는 clojure.lang.Compiler 쳐다 clojure.lang.Compiler , 프록시생성 프록시 는 이제는 이것을 작동 시키려고 노력하고있다. 증기 :(

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

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

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




Related