Groovy에서 java.lang.VerifyError가 발생했을 때의 해결 방법

9177 단어 Groovy자바
Groovy에서 Jenkins 플러그인을 만들었고 약간의 리팩토링 만 업데이트했지만 플러그인 내에서 오류가 발생하여 Jenkins 플러그인을로드하지 못했습니다.

이번은 그 해결 방법입니다.

tl;dr



코드 레벨에서 차이가 없으면 컴파일러를 의심합니다.

오류 내용


./gradlew server

(略)

Jenkins home directory: /Users/sueyoshi_go/workspace/github.com/jenkinsci/yaml-axis-plugin/work found at: System.getProperty("JENKINS_HOME")
Failed to instantiate Key[type=org.jenkinsci.plugins.yamlaxis.YamlAxis$DescriptorImpl, annotation=[none]]; skipping this component
com.google.inject.ProvisionException: Guice provision errors:

1) Error injecting constructor, java.lang.VerifyError: (class: org/jenkinsci/plugins/yamlaxis/YamlAxis, method: super$1$forEach signature: (Ljava/util/function/Consumer;)V) Illegal use of nonvirtual function call
  at org.jenkinsci.plugins.yamlaxis.YamlAxis$DescriptorImpl.<init>(YamlAxis.groovy:80)

1 error
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:52)
    at com.google.inject.Scopes$1$1.get(Scopes.java:65)
    at hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1.get(ExtensionFinder.java:427)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051)
    at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001)
    at hudson.ExtensionFinder$GuiceFinder._find(ExtensionFinder.java:389)
    at hudson.ExtensionFinder$GuiceFinder.find(ExtensionFinder.java:380)
    at hudson.ClassicPluginStrategy.findComponents(ClassicPluginStrategy.java:386)
    at hudson.ExtensionList.load(ExtensionList.java:300)
    at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253)
    at hudson.ExtensionList.getComponents(ExtensionList.java:154)
    at hudson.DescriptorExtensionList.load(DescriptorExtensionList.java:182)
    at hudson.ExtensionList.ensureLoaded(ExtensionList.java:253)
    at hudson.ExtensionList.iterator(ExtensionList.java:143)
    at hudson.model.ComputerSet.<clinit>(ComputerSet.java:441)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at hudson.init.TaskMethodFinder.invoke(TaskMethodFinder.java:106)
    at hudson.init.TaskMethodFinder$TaskImpl.run(TaskMethodFinder.java:176)
    at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:282)
    at jenkins.model.Jenkins$7.runTask(Jenkins.java:904)
    at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:210)
    at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.VerifyError: (class: org/jenkinsci/plugins/yamlaxis/YamlAxis, method: super$1$forEach signature: (Ljava/util/function/Consumer;)V) Illegal use of nonvirtual function call
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at hudson.model.Descriptor.<init>(Descriptor.java:284)
    at hudson.matrix.AxisDescriptor.<init>(AxisDescriptor.java:43)
    at org.jenkinsci.plugins.yamlaxis.YamlAxis$DescriptorImpl.<init>(YamlAxis.groovy)
    at org.jenkinsci.plugins.yamlaxis.YamlAxis$DescriptorImpl$$FastClassByGuice$$9a80bc2f.newInstance(<generated>)
    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    ... 29 more

오류 부분

조사



버전 간의 차이를 봐도 어디가 나쁜지 모르겠다. . . (0.1.0이 정상적으로 움직이던 버전에서 0.1.1이 오류가 된 버전)

겨우 제대로 동작하고 있던 버전의 tag를 checkout해도 같은 에러가 발생.

"코드 레벨에서 차이가 없다면 컴파일러가 나쁘지 않습니까?"라고 조사하면 빙고였습니다.

사용한 JDK 버전



v0.1.0(성공적으로 실행된 버전)을 빌드한 JDK
$ java -v
openjdk version "1.7.0-u10-b09"
OpenJDK Runtime Environment (build 1.7.0-u10-b09-20121015)
OpenJDK 64-Bit Server VM (build 23.6-b03, mixed mode)

v0.1.1(오류가 발생한 버전)을 빌드한 JDK
$ java -v
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

덧붙여서 왜 v0.1.0과 v0.1.1에서 JDK의 버전이 다른가 하면 플러그인 개발을 위해 로컬로 Jenkins를 움직이는 것이 무겁기 때문에 도중부터 스펙이 높은 PC(JDK 8)를 사용하게 했기 때문입니다

최종적으로는 v0.1.0을 빌드한 것과 같은 PC(JDK 7)로 빌드 다시 동작 확인하면 에러가 나오지 않게 되어 있는 것을 확인할 수 있었으므로 릴리스했습니다.

교훈



단위 테스트가 녹색이라면 작동을 확인하지 않고 출시해서는 안됩니다.

추가



Groovy에서 JDK 8 지원되는 것은 2.3에서였습니다.

1

Jenkins와의 합의로 Groovy의 버전은 1.8.9에 고정하고 있기 때문에 The Groovy programming language - Groovy 2.3 release notes , JDK 8이라고 올바르게 빌드할 수 없다는 것은 있을 것 같다.



은근히 쓰고 있지만 컴파일러에 도착하는 데 밤새 걸립니다. 2

참조  Groovy와 Gradle에서 Jenkins 플러그인 만들기 - Qiita

좋은 웹페이지 즐겨찾기