Grails 2.0.0 çalışma zamanında oluşturulan Clojure 1.2.1 / 1.3 / 1.4 'proxy'si başarısız oluyor. 1.2.0 iyidir


103

Ben uzanan üzerinde çalışıyorum Grails Clojure eklentisi içinde Grails 2.0.0 (ve 2.1.0-SNAPSHOT) ve ben bunu güncellemek istedim Clojure 1.3.0 ve eklemek clojure.tools.logging .

Clojure bir derleme sırasında bir özel durum atar vekaleten a ByteArrayOutputStreamiçinde clojure.tools.loggingbireyin günlük akışı fonksiyonu:

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

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

Gittim ve kaldırılır clojure.tools.loggingve tam olmayan bir yazdı vekil arasında Object:

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

ve aynı şeyi ClassCastExceptionve mesajı da attı .

Bir yazdırmaya çalıştı macroexpand-1 arasında vekaleten ve aynı şey var.

Clojure 1.2.0'a geri döndüm ve proxy tekrar iyi çalıştı.

1.4.0'ın bir dizi enkarnasyonunu denedim ve 1.3.0 ile aynı davranışı sergiliyorlar. 1.2.1 de bir çeşit istisna atıyor ama 1.3.0'a ulaşmaya çalışıyorum bu yüzden bununla fazla zaman harcamadım.

'Jeneratör yöntem fonksiyonuna yığın izleme noktaları birinde tanımlanan let biçimleri generate-proxyde core_proxy.clj.

printlnNeler olduğunu anlayıp anlayamayacağımı görmek için oraya küçük bir parça ekledim . Belki bir sonraki ifade, okuyucunun benim açımdan büyük bir yanlış anlaşılmasına ihanet eder, ancak bunların eklenmesi println, derleme zamanı davranışını hiç beklemediğim bir şekilde değiştirdi. Tüm Clojure testleri mvn packagegeçmeye devam etmesine rağmen istisna konumu ve istisna türü tamamen değişti .

Örneğin, printlnbayt kodu oluşturmaya başlamadan hemen önce gen yöntemine bir tek eklemek Clojure'un

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

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

Nereye koyduğuma bağlı olarak başka çeşitli hatalar da gördüm, printlnancak bu en yaygın olanı.

Açıkçası, Grails ve Clojure'un bazı yönleri burada doğru şekilde birbirine geçmiyor, ancak bağlantıyı görmüyorum. İlk başta ASM uyumsuzluğundan şüphelendim ama Clojure'un kendi ASM ad alanı olduğundan, sorunun bu olduğunu göremiyorum. Ama belki yanılıyorum, günlerdir clojure.lang.Compiler, vekil ve proxy oluşturmaya bakıyordum ve şimdi bunu çalıştırmaya çalışıyorum ve ileriye doğru ilerlemeyi bıraktım çünkü buharım tükendi :(

Bağlantı eksikliği için özür dilerim. Aşağıdan kopyalayıp yapıştırabilirsiniz:

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

Clojure Tools Logging - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj satır 133 'proxy'dir


4
Biraz daha test yaptım ve bunun Grails 2.0'da Clojure 1.3'ün dayandığı bir şeyi mahvettiğine ikna oldum. Düşünebildiğim en basit kod örneğini Grails 1.3.7, Groovy 1.8.4 (Grails 2.0'ın kullandığı) ve Groovy 1.8.5'te (en son) test ettim ve hepsi işe yarıyor.
John Courtland

3
Bu bir ClassLoader sorunu olabilir mi?
Jeremy

Yanıtlar:


4

Aradım Sorun bulundu CLJ-944üzerinde clojure.org . Orada ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Classsorun için bir düzeltme bulabilirsiniz

Problem şu:

derleyicinin clojure.lang.PersistentHashMap'e yanlış bir çevrim enjekte ettiğini. Bu durumda, muhtemelen .containsKey yöntemine sahip en yüksek ortak arabirim olan clojure.lang.Associative'e dönüştürülmelidir.

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

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

Umut ediyorum bu yardım eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.