2012-10-08 16 views
5

Projemi derlediğimde ve JDK7 veya JDK6 ile Eclipse'de çalıştırdığımda her şey yolunda. Ancak bu ANT kullanarak ve daha sonra sistem JDK7 kullanarak çalıştırmak için güvenilir oluşturduktan sonra, hata iletisi: yöntem myClass.myMethod şube hedef 25 °Java 7 - Tutarsız stackmap çerçeveleri - Çözümün neden işe yaradığını anlama konusunda yardıma ihtiyacınız var

tutarsız stackmap çerçevelerini() [[Ljava/lang/nesne; En 14

her yere baktım ofset ve StackOverflow'daki burada iyi birkaç soru bulundu:

İkisi temelde olarak -XX:-UseSplitVerifier eklemek önermek Sorunu çözen JVM seçeneği. Hala nedenini tam olarak anlamıyorum ama görünüşe göre this bug report yardım etmek için varsayalım. Ne yazık ki hala bunu anlamıyorum ...

Birisi bana Aspect yönelimli programlama kullandığını düşündüğüm sorulardan birinde fark ettim, bu da bana bu soruna neden olabilecek Guice (Google'ın DI çerçevesi) kullanıyorum ama nasıl göremiyorum. JDK7'yi desteklemesi bekleniyor.

Aynı zamanda Proguard'ı kullanıyorum, fakat bu da JDK7 ile çalışmayı düşünüyor.

Bu noktada, bu geçici çözümün, kodun bir kısmı bayt koduyla çalmaya çalıştığı (bu durumda JDK6) sürümüne temelde geri düşmekten başka neden çalışmadığı konusunda hiçbir fikrim yok. bu yüzden DI) kodu ile ilgili olduğunu düşünüyorum. Ama hala uygun bağlantıyı yapamıyorum. Ve ayrıca yoldan da olabilirdim!

Birisi ne olup bittiğini veya bunun neden olduğunu açıklayabilirse, son derece minnettar olurdum. Ayrıca, bir geçici çözüm kullanmaktan nefret ediyorum, çünkü uzun vadeli bir çözüm düşünmüyorum.

+0

* "JDK7'yi desteklediğini varsayalım." * - belki desteği buggy. Guice sorunu izleyici/grup/listeleri aradınız mı? –

+0

Sorun izleyicilerdeki hatalar açısından hiçbir şey bulamadık –

+0

Tahminimce java7'de, kontrolleri doğrulayan daha agresif bayt kodu eklediler ve bağımlılık enjeksiyonunu yapmak için bayt koduyla ne yapıyorsa onu yapıyorlar Bu karıncalarla yaptığınızı söylerseniz, o kontroller –

cevap

3

Java 7'den derlenmiş bir bayt kodu StackMapTable ek öznitelikleri içermelidir. Bunlar, sınıf yükleme süresinde sınıfların sağlam bir şekilde oluşturulduğunu kontrol etmek için JVM içindeki doğrulayıcıya yardımcı olur. Java'nın önceki sürümleri daha az güvenilirdir ve öznitelikleri olmadan daha yavaş doğrulamaya geri dönerler.

Orijinal derlenmiş bayt kodunu (derlemeden hemen sonra ProGuard, yürütmeden hemen önce AOP çerçeveleri, ... ...) değiştiren araçlar, değiştirilen kodla tutarlı bir şekilde özelliklerin güncellenmesi gerekir. Bunu yapamazlarsa, "Tutarsız yığın haritası" hata iletisini alırsınız. ProGuard, bu ön düzeltme cezasını uygulamalıdır; Onunla ilgili herhangi bir sorun olduğunun farkında değilim. ProGuard'ı uygulamadan hala hatayı görüyorsanız, sorun DI veya AOP ile birlikte olmalıdır.

İlgili konular