2014-09-02 10 views
7

Le attuali versioni di java (8u20, 7u67) rompere Gradle \ groove compilatore e runtime compatibilità:Gradle: Bad <init> chiamata di metodo all'interno di una filiale (invokespecial)

:compileTestGroovy FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':compileTestGroovy'. 
> Bad <init> method call from inside of a branch 
    Exception Details: 
    Location: 
     some/MyClass.<init>(Lsome/MyOtherClass;)V @71: invokespecial 
    Reason: 
     Error exists in the bytecode 
    Bytecode: 
     0x0000000: b800 174d 04bd 0019 5903 2b53 5910 ff12 
     0x0000010: 05b8 001f 2a5f ab00 0000 0055 0000 0003 
     0x0000020: f20b c677 0000 0022 0000 9b75 0000 0037 
     0x0000030: 2cce be6d 0000 0040 5f5a 5903 3212 05b8 
     0x0000040: 0023 c000 055f 57b7 0026 a700 2b5f 5a57 
     0x0000050: b700 29a7 0022 5f5a 5903 3212 2bb8 0023 
     0x0000060: c000 2b5f 57b7 002e a700 0dbb 0030 5912 
     0x0000070: 32b7 0035 bf57 2ab6 0039 4e2d 2a5f b500 
     0x0000080: 3b2d 572c 123c 322a 123e b900 4403 0057 
     0x0000090: b1          
    Stackmap Table: 
     full_frame(@56,{UninitializedThis,Object[#74],Object[#76]},{Object[#78],UninitializedThis}) 
     full_frame(@77,{UninitializedThis,Object[#74],Object[#76]},{Object[#78],UninitializedThis}) 
     full_frame(@86,{UninitializedThis,Object[#74],Object[#76]},{Object[#78],UninitializedThis}) 
     full_frame(@107,{UninitializedThis,Object[#74],Object[#76]},{Object[#78],UninitializedThis}) 
     full_frame(@117,{Object[#2],Object[#74],Object[#76]},{Object[#78]}) 

Persone provenienti da ZeroTurnaround anche notato questo comportamento: http://zeroturnaround.com/forums/topic/verifyerror-bad-method-call-from-inside-of-a-branch/

La domanda è semplice: mentre attendiamo qualsiasi soluzione nelle prossime versioni di java, è possibile ovviare a questo problema?

risposta

10

Il modo più ovvio per gestire VerifyError consiste nell'utilizzare l'opzione -noverify jvm.

(Assumendo versione Gradle> = 1,12, e involucro Gradle come bin eseguibile)

Prima di tutto, dire Gradle di utilizzare l'opzione per il processo di compilazione (in build.gradle):

compileGroovy { 
    groovyOptions.forkOptions.jvmArgs = ['-noverify'] 
} 

Per runtime, si dovrebbe passare l'opzione JVM anche: compito

prova:

test { 
    jvmArgs '-noverify' 
} 

Se si utilizza il plug-in dell'applicazione:

applicationDefaultJvmArgs = ["-noverify"] 

Oppure con qualsiasi altro mezzo.

Questo sarà tutto. Felice in attesa per il rilascio di Java con correzione:

+1

Arun è corretta. Questo è un bug JDK quindi l'aggiornamento ad almeno 7u72 dovrebbe risolverlo per te. Stavo riscontrando il problema e, dopo aver installato 7u72, la mia build funziona correttamente. – Mikezx6r

+1

Non posso votare questa soluzione abbastanza. È stato esasperante dal momento che nessun altro nel mio gruppo aveva questo problema (avevano 1.7 JDK diversi). L'aggiornamento a u79 mi ha risolto. –

4

Succede quando Constructor chiamate eccellente.

L'aggiunta di @CompileStatic su Constructor risolve il problema.

+0

La soluzione più semplice. Funziona alla grande! – linuxeasy

+0

Ottima soluzione –

4

questo un bug JDK & è stato risolto nella versione più recente del JDK 7 U72