2012-02-01 18 views
103

Tôi đang làm việc để mở rộng Grails Clojure plugin trong Grails 2.0.0 (và 2.1.0-SNAPSHOT) và tôi muốn cập nhật nó thành Clojure 1.3.0 và thêm clojure.tools.logging.Clojure 1.2.1/1.3/1.4 'proxy được tạo trong thời gian chạy Grails 2.0.0 không thành công. 1.2.0 là tốt

Clojure ném một ngoại lệ trong biên soạn một Proxy của một ByteArrayOutputStream trong clojure.tools.logging 's hàm log-stream:

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

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

tôi đã đi và loại bỏ clojure.tools.logging và đã viết một số điện thoại bị tước bỏ của Object:

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

và nó cũng ném cùng ClassCastException và tin nhắn.

Tôi cố gắng để in một macroexpand-1 của Proxy và nhận được điều tương tự.

Tôi hoàn nguyên về Clojure 1.2.0 và proxy hoạt động tốt trở lại.

Tôi đã thử một số lần xuất hiện 1.4.0 và chúng thể hiện hành vi tương tự như 1.3.0. 1.2.1 cũng ném một số loại ngoại lệ nhưng tôi đang cố gắng để đạt 1.3.0 vì vậy tôi đã không dành nhiều thời gian với điều đó.

Dấu vết ngăn xếp trỏ đến chức năng 'phương pháp gen được xác định trong một trong số cho phép các hình thức generate-proxy trong core_proxy.clj.

Tôi đã thêm một chút nhỏ của println xung quanh đó để xem liệu tôi có thể nắm bắt những gì đang diễn ra hay không. Có lẽ tuyên bố tiếp theo này sẽ phản bội một sự hiểu lầm rất lớn của người đọc về phía tôi nhưng chỉ cần thêm những người println s đã thay đổi hành vi biên dịch theo cách mà tôi hoàn toàn không mong đợi. Vị trí ngoại lệ và loại ngoại lệ đã hoàn toàn thay đổi, mặc dù tất cả các kiểm tra Clojure ở số mvn package vẫn tiếp tục trôi qua.

Ví dụ, chỉ cần thêm một đơn println để gen-phương pháp ngay trước khi nó bắt đầu tạo ra bytecode gây ra Clojure để ném

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

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

Tôi đã nhìn thấy nhiều lỗi khác tùy thuộc về nơi tôi đặt println (s) nhưng điều này là phổ biến nhất.

Rõ ràng một số khía cạnh của Grails và Clojure không chia lưới chính xác ở đây, nhưng tôi không thấy kết nối. Lúc đầu tôi nghi ngờ ASM không tương thích nhưng kể từ khi Clojure có không gian tên ASM riêng của nó, tôi không thể thấy đó là vấn đề.Nhưng có thể tôi đã sai, tôi đã nhìn chằm chằm vào clojure.lang.Compiler, proxytạo proxy cho các ngày hiện đang cố gắng làm việc này và tôi đã ngừng thực hiện nhiều tiến bộ vì tôi đã hết hơi :(

tôi xin lỗi vì sự thiếu liên kết Bạn có thể sao chép và dán từ bên dưới:.

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

Clojure cụ Logging - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj dòng 133 là 'Proxy

+4

Tôi đã thực hiện một số thử nghiệm khác và tôi hoàn toàn tin rằng đó là điều gì đó trong Grails 2.0 đang phá hỏng thứ mà Clojure 1.3 dựa vào. Tôi đã thử nghiệm mẫu mã đơn giản nhất mà tôi có thể quan tâm trong Grails 1.3.7, Groovy 1.8.4 (đó là những gì Grails 2.0 sử dụng) và Groovy 1.8.5 (mới nhất) và tất cả các công việc đó. –

+3

Đây có phải là sự cố ClassLoader không? – Jeremy

Trả lời

4

Tôi đã tìm thấy Sự cố được gọi là CLJ-944 trên clojure.org. Ở đó bạn có thể tìm thấy một sửa chữa cho vấn đề ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class

Vấn đề là:

rằng trình biên dịch tiêm một dàn diễn viên không chính xác để clojure.lang.PersistentHashMap. Trong trường hợp này, có thể là truyền đến một clojure.lang.Associative, giao diện phổ biến cao nhất có phương thức .containsKey.

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

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

Tôi hy vọng nó giúp.

Các vấn đề liên quan