Search code examples
javalinuxjacocotomcat9

Jacoco agent faild to start on tomcat9: java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.$JaCoCo


When I try to start my tomcat 9 server on linux I have this error:

NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.jacoco.agent.rt.internal_4a7f17c.core.runtime.InjectedClassRuntime$Lookup.defineClass(InjectedClassRuntime.java:134)
        at org.jacoco.agent.rt.internal_4a7f17c.core.runtime.InjectedClassRuntime.startup(InjectedClassRuntime.java:54)
        at org.jacoco.agent.rt.internal_4a7f17c.PreMain.premain(PreMain.java:50)
        ... 6 more
Caused by: java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.$JaCoCo. (java.lang.$JaCoCo is in module java.base of loader 'bootstrap')
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.System$2.defineClass(System.java:2131)
        at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:962)
        ... 13 more
*** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed

I use this command line: -javaagent:/home/jenkins/tools/jacoco/lib/jacocoagent.jar=port=6300,destfile=/home/jenkins/jacoco/jacoco.exec,output=tcpserver,includes=myPackage.*,append=false

I am using OpenJDK 64-Bit Server VM Corretto-11.0.19.7.1, the latest version of tomcat9 and jacoco 0.8.10.

I have the same configuration on windows and it works fine. My application is a war buit with maven and I don't have any problems on windows.

I tried to change my tomcat version and my JDK version but I still have the same problem. I don't find any solutions on the web. I have no Jacoco dependencies in my pom.xml


Solution

  • Thanks for your help. I solved my problem by changing:

    export JAVA_OPTS="$JAVA_OPTS -Dlogback.ContextSelector=JNDI -Xms2G -Xmx16G -javaagent:/home/jenkins/tools/jacoco/lib/jacocoagent.jar=port=6300,destfile=/home/jenkins/jacoco/jacoco.exec,output=tcpserver,includes=com.worldline.*,address=localhost,append=false"
    

    By:

    export CATALINA_OPTS="-Dlogback.ContextSelector=JNDI -Xms2G -Xmx16G -javaagent:/home/jenkins/tools/jacoco/lib/jacocoagent.jar=port=6300,destfile=/home/jenkins/jacoco/jacoco.exec,output=tcpserver,includes=com.worldline.*,address=localhost,append=false