2011-12-26 17 views
12

Ciao Sto facendo un test di prova usando maven 3.0.3 con versione finale 4.0.0 di hibernate e spring 3.1 su jdk7 update 2.Come faccio a eseguire il test dell'unità in java 7: java.lang.VerifyError: Aspettando un frame stackmap al target di diramazione

Ho ricevuto il seguente errore.

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) 

Il metodo My Equals utilizza EqualsBuilder da commons-lang 2.6. Ho impostato il seguente Maven opta

SET MAVEN_OPTS=%MAVEN_OPTS% -XX:-UseSplitVerifier 

dopo aver letto questo Java 7 JVM verifyError

Nota: Le mie opere test sotto JDK 1.6 update 29.

Come posso risolvere questo problema? Sembra che l'impostazione -XX: -UseSplitVerifier causi ancora l'errore.

+0

Vorrei pulire e creare nuovamente tutto il progetto e provare altre lib di commons-lang. Sembra un po 'come questo: http://stackoverflow.com/a/8617057/1064325 – falsarella

+0

Hibernate utilizza cglib e, a seconda di come è stato impostato Spring, potrebbe anche usare librerie simili, forse potrebbero essere la colpa. Prova ad usare una versione più recente di cglib nel tuo classpath e vedi se questo soddisfa. –

risposta

14

Secondo surefire plugin documentation MAVEN_OPTS non sono ereditate da una JVM generato, quindi è necessario specificare argLine parametro di configurazione con -XX: -UseSplitVerifier in elemento di configurazione maven-surefire-plugin.

+0

Forse puoi accettare la risposta allora. Grazie. :) –

+4

Es: ' org.apache.maven.plugins Maven-infallibile-plug XX: -UseSplitVerifier ' –

+0

Come per fare questo usando Ant? Cosa ho provato ? Non funziona. Sto usando JDK 6 u43 –

-1

Sembra che si stia eseguendo un comando del verificatore di codice bytecode "migliorato" (che in realtà è reso inattivo in modo che richieda molte più informazioni sul verificatore fornite dal compilatore). È necessario che il codice venga elaborato da una stringa del compilatore che produca il formato "tecnicode "migliorato oppure che la versione del file di classe sia impostata sulla versione" vecchia "(che a mio avviso sarebbe inferiore alla 50.0).

+0

Il problema non è in realtà nel codice utente, ma negli strumenti/librerie, come Hibernate e CGLIB. Questi strumenti non sono a conoscenza dei nuovi requisiti del bytecode e ovviamente non funzionano bene con le classi compilate per il targeting Java 7. –

+0

@EugeneKuleshov - Quindi quale soluzione proponi oltre a una delle due che ho suggerito? –

+0

Ecco la cosa. Non hai davvero offerto una soluzione al problema del poster originale, ma hai fatto alcune osservazioni offensive sul verificatore del codice byte. –