Hi,
We're working on an SAP-Commerce (ex Hybris) project and want to measure test-coverage in our build-pipeline. SAP-Commerce uses ant for builds and Tests. Earlier versions of it had a pre-defined ant task called jacocoalltests which executed all tests with coverage. In newer versions of SAP-Commerce this task is gone and I'm trying to rebuild it. Reading the former task definition and the jacoco documentation I wrote the following ant task, which is supposed to set the appropriate jvm-parameter when the actual test-execution is performed:
```{xml}
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="REDACTED/lib/"/>
</taskdef>
<target name="jacocoalltests" description="runs allstests with jacoco attached">
<jacoco:agent property="agentvmparam"
append="true"
output="file"
destfile="${HYBRIS_LOG_DIR}/junit/jacoco.exec"
excludes="jdk.internal.*"
inclnolocationclasses="true"
/>
<property name="testclasses.extensions" value="${extname}"/>
<ant dir="${platformhome}" target="alltests" inheritrefs="false">
<property name="standalone.javaoptions" value="${agentvmparam} ${standalone.javaoptions}"/>
</ant>
</target>
```
The referenced classpath includes jacoco-core-0.8.6.jar, jacoco-ant-0.8.6.jar, jacoco-report-0.8.6.jar and jacoco-agent-0.8.6.jar. The excludes and inclnolocationclasses were included after reading
https://github.com/jangrewe/gitlab-ci-android/issues/59 - without them there is no different outcome.
I've tried to execute this task with two different JDKs, one being the debian build of openjdk-11 and the other being the current version of sapmachine (see also below).
The latter is the JDK we actually ant to use.
When I execute it I get teh following error for both tested JDKs:
```
---snip---
alltests:
[echo] preparing...
---snip---
[echo] jvmargs: -javaagent:/tmp/jacocoagent11926682159682554528.jar=destfile=/home/developer/hybris-logs/junit/jacoco.exec,append=true,excludes=jdk.internal.*,inclnolocationclasses=true,output=file -Xmx2g -Djava.locale.providers=COMPAT,CLDR --add-exports="java.base/jdk.internal.ref=ALL-UNNAMED" --add-exports="java.naming/com.sun.jndi.ldap=ALL-UNNAMED" --add-exports="jdk.management.agent/jdk.internal.agent=ALL-UNNAMED" -Ddeployed.server.type="tomcat"
---snip---
[yunitint] --> found 1731 testclasses!
[yunitint] FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed
[yunitint] Exception in thread "main" java.lang.reflect.InvocationTargetException
[yunitint] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[yunitint] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[yunitint] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[yunitint] at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[yunitint] at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
[yunitint] at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
[yunitint] Caused by: java.lang.RuntimeException: Class java/util/UUID could not be instrumented.
[yunitint] at org.jacoco.agent.rt.internal_8ff85ea.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:140)
[yunitint] at org.jacoco.agent.rt.internal_8ff85ea.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:101)
[yunitint] at org.jacoco.agent.rt.internal_8ff85ea.PreMain.createRuntime(PreMain.java:55)
[yunitint] at org.jacoco.agent.rt.internal_8ff85ea.PreMain.premain(PreMain.java:47)
[yunitint] ... 6 more
[yunitint] Caused by: java.lang.NoSuchFieldException: $jacocoAccess
[yunitint] at java.base/java.lang.Class.getField(Class.java:1999)
[yunitint] at org.jacoco.agent.rt.internal_8ff85ea.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:138)
[yunitint] ... 9 more
[yunitint] *** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 422
---snip---
```
As you can see the jacoco javaagent seems to be the first jvm-argument, as was recommended in the documentation.
Am I missing something? What further checks could I perform to see, whether this is a Problem with my task-definition, with the SAP-Commerce Build-Framework or with jacoco itself?
Thanks a lot!
Johannes Ballmann
Environment
* OS: Debian stable
* JDK
** OpenJDK:
$ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-post-Debian-1deb10u2)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-post-Debian-1deb10u2, mixed mode, sharing)
** Sap-Machine:
$ java -version
openjdk version "11.0.9.1" 2020-11-05 LTS
OpenJDK Runtime Environment SapMachine (build 11.0.9.1+1-LTS-sapmachine)
OpenJDK 64-Bit Server VM SapMachine (build 11.0.9.1+1-LTS-sapmachine, mixed mode)
* ant: Apache Ant(TM) version 1.10.6 compiled on May 2 2019