IT

Clojure 1.2.1 / 1.3 / 1.4 'Grails 2.0.0 작동에서 생성 된 프록시가 실패합니다.

lottoking 2020. 8. 15. 09:33
반응형

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


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

Clojure의는 에서 의 로그 스트림 함수의 프록시컴파일하는 동안 예외를합니다 던져 .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은 '프록시


나는라는 문제 발견 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

도움이되기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/9101969/clojure-1-2-1-1-3-1-4-proxy-generated-in-grails-2-0-0-runtime-fails-1 -2-0-is-f

반응형