Grails 2.0.0 (및 2.1.0-SNAPSHOT) 에서 Grails Clojure 플러그인 을 확장하는 중이며 Clojure 1.3.0 으로 업데이트하고 clojure.tools.logging을 추가하고 싶었습니다 .
Clojure는 in 의 로그 스트림 함수의 프록시 를 컴파일하는 동안 예외를 throw합니다
.ByteArrayOutputStream
clojure.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
, proxy 및 generate-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은 '프록시