8

現在のバージョンの Java (8u20、7u67) では、gradle\groovy コンパイラとランタイムの互換性が失われます。

: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]})

ZeroTurnaround の人々もこの動作に気付きました: http://zeroturnaround.com/forums/topic/verifyerror-bad-method-call-from-inside-of-a-branch/

質問は簡単です。Java の次のバージョンでの解決策を待っていますが、この問題の回避策はありますか?

4

3 に答える 3

10

VerifyError を処理する最も明白な方法は、-noverify jvm オプションを使用することです。

(gradle バージョン >=1.12、および実行可能 bin としての gradle ラッパーを想定)

まず、コンパイル プロセスにオプションを使用するように gradle に指示します (build.gradle 内)。

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

実行時には、jvm オプションも渡す必要があります。

テスト タスク:

test {
    jvmArgs '-noverify'
}

アプリケーション プラグインを使用する場合:

applicationDefaultJvmArgs = ["-noverify"]

または、他の手段で。

それだけです。修正された Java のリリースをお待ちください:

于 2014-09-02T10:38:34.807 に答える
5

これは jdk のバグであり、最新の jdk バージョン 7 u72 で修正されています。

于 2014-10-16T16:04:16.107 に答える
4

Constructorsuper を呼び出したときに発生します。

追加@CompileStaticするConstructorと問題が解決します。

于 2014-09-16T20:03:17.723 に答える