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
, proxy và tạ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
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 đó. –
Đây có phải là sự cố ClassLoader không? – Jeremy