When the classpath of a test is over the CLASSPATH_LIMIT, Bazel will create a manifest jar that contains a manifest with an entry of the classpath.
The JacocoCoverageRunner accounts for this and will undo the process to find the classpath during coverage collection. However, one of the checks (urls.length == 1) assumes that the manifest jar is the only jar on the classpath.
If a test has a jar in its data, it can also be added to the classpath. Since the length of the array is greater than 1, the logic is skipped and the coverage collection file is empty.
//repro:repro_test is a simple test that adds a bytebuddy jar as a javaagent and adds the relevant jar to data.
Since the classpath is very small, the manifest jar is not created, so coverage is collected successfully:
$ bazel test //repro:repro_test
...
$ du -h bazel-out/_coverage/_coverage_report.dat
4.0K bazel-out/_coverage/_coverage_report.dat
However, if I manually override CLASSPATH_LIMIT so that a manfiest jar is created, coverage disappears.
$ bazel test //repro:repro_test --action_env CLASSPATH_LIMIT=1
...
$ du -h bazel-out/_coverage/_coverage_report.dat
0 bazel-out/_coverage/_coverage_report.dat
If I remove the javaagent and run the same command, coverage is collected again:
$ bazel test //repro:repro_test --action_env CLASSPATH_LIMIT=1
...
$ du -h bazel-out/_coverage/_coverage_report.dat
4.0K bazel-out/_coverage/_coverage_report.dat