2011-12-26 23 views
12

Xin chào Tôi đang chạy thử nghiệm maven bằng cách sử dụng maven 3.0.3 với bản phát hành cuối cùng hibernate 4.0.0 và mùa xuân 3.1 trên bản cập nhật jdk7 2.Làm cách nào để chạy thử nghiệm đơn vị chạy trong java 7: java.lang.VerifyError: Mong đợi khung stackmap tại mục tiêu chi nhánh

Tôi nhận được lỗi sau.

Caused by: java.lang.VerifyError: Expecting a stackmap frame at branch target 63 in method ${myDomainClass}.equals(Ljava/lang/Object;)Z at offset 24 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2442) 
    at java.lang.Class.getDeclaredMethods(Class.java:1808) 
    at org.hibernate.property.BasicPropertyAccessor.getterMethod(BasicPropertyAccessor.java:352) 
    at org.hibernate.property.BasicPropertyAccessor.getGetterOrNull(BasicPropertyAccessor.java:331) 
    at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:314) 
    at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:310) 
    at org.hibernate.internal.util.ReflectHelper.getter(ReflectHelper.java:250) 
    at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:229) 
    at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.java:314) 
    at org.hibernate.cfg.HbmBinder.bindSimpleId(HbmBinder.java:447) 
    at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:380) 
    at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:320) 
    at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:171) 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3377) 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3369) 
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3357) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1334) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1724) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 

Phương thức equals của tôi đang sử dụng EqualsBuilder từ commons-lang 2.6. tôi đặt maven sau opts

SET MAVEN_OPTS=%MAVEN_OPTS% -XX:-UseSplitVerifier 

sau khi đọc này Java 7 JVM verifyError

Lưu ý: kiểm tra các công trình của tôi dưới jdk 1.6 cập nhật 29.

Làm thế nào để sửa lỗi này? Có vẻ như thiết lập -XX: -UseSplitVerifier vẫn gây ra lỗi.

+0

Tôi sẽ làm sạch và xây dựng lại toàn bộ dự án và thử các thư viện libons-lang khác. Có vẻ hơi giống vấn đề này: http://stackoverflow.com/a/8617057/1064325 – falsarella

+0

Hibernate sử dụng cglib và phụ thuộc vào cách bạn đã thiết lập mùa xuân, nó cũng có thể sử dụng các thư viện tương tự, có thể chúng có thể đổ lỗi. Hãy thử sử dụng một phiên bản mới hơn của cglib trong classpath của bạn và xem có thỏa mãn không. –

Trả lời

14

Theo surefire plugin documentation MAVEN_OPTS không được kế thừa bởi một JVM sinh sản, vì vậy bạn cần chỉ định tham số cấu hình argLine với -XX: -UseSplitVerifier trong phần tử cấu hình maven-surefire-plugin.

+0

Có lẽ bạn có thể chấp nhận câu trả lời sau đó. Cảm ơn. :) –

+4

Ex: ' org.apache.maven.plugins maven-surefire-plugin -XX: -UseSplitVerifier ' –

+0

thế nào để làm điều này bằng cách sử dụng Ant? Tôi đã thử ? Không làm việc. Tôi đang sử dụng JDK 6 u43 –

-1

Dường như bạn đang chạy afoul của trình xác minh bytecode "được cải tiến" (mà thực sự bị bỏ qua sao cho nó đòi hỏi nhiều thông tin trình xác minh được cung cấp bởi trình biên dịch). Bạn cần phải lấy mã của bạn được xử lý bởi một chuỗi trình biên dịch tạo ra định dạng bytecode "được cải tiến" hoặc có phiên bản của tệp lớp được đặt thành phiên bản "cũ" (mà tôi nghĩ là một cái gì đó nhỏ hơn 50.0).

+0

Vấn đề thực sự không có trong mã người dùng, nhưng trong các công cụ/thư viện, chẳng hạn như Hibernate và CGLIB. Những công cụ này không nhận thức được các yêu cầu bytecode mới và rõ ràng là không hoạt động tốt với các lớp được biên dịch để nhắm mục tiêu Java 7. –

+0

@EugeneKuleshov - Vậy bạn đề xuất giải pháp nào khác ngoài một trong hai đề xuất? –

+0

Đây là điều. Bạn đã không thực sự đưa ra một giải pháp cho vấn đề áp phích ban đầu, nhưng thực hiện một vài nhận xét xúc phạm về trình xác minh bytecode. –