Gradle 如何确保jacoco';在命令行中,s-javaagent排在其他javaagent之前(例如spring和aspectj)。。。?

Gradle 如何确保jacoco';在命令行中,s-javaagent排在其他javaagent之前(例如spring和aspectj)。。。?,gradle,jacoco,jacoco-plugin,Gradle,Jacoco,Jacoco Plugin,如何确保jacoco隐式添加的-javaagentJVM arg位于命令行上所有其他-javaagentJVM参数之前 我们正在使用spring+aspectj,并要求在测试中提供以下JVM参数: -javaagent:/path-to/aspectjweaver-1.9.2.jar -javaagent:/path-to/spring-instrument-5.1.5.RELEASE.jar 我们的测试运行良好,但当我们尝试使用jacoco时,我们会在jacocoTestReport期间

如何确保jacoco隐式添加的
-javaagent
JVM arg位于命令行上所有其他
-javaagent
JVM参数之前

我们正在使用spring+aspectj,并要求在测试中提供以下JVM参数:

 -javaagent:/path-to/aspectjweaver-1.9.2.jar -javaagent:/path-to/spring-instrument-5.1.5.RELEASE.jar 
我们的测试运行良好,但当我们尝试使用jacoco时,我们会在jacocoTestReport期间收到一些类的警告:

05:49:27  > Task :core-service:jacocoTestReport
05:49:27  [ant:jacocoReport] Classes in bundle 'core-service' do no match with execution data. For report generation the same class files must be used as at runtime.
05:49:27  [ant:jacocoReport] Execution data for class com/acme/FooService does not match.
05:49:27  [ant:jacocoReport] Execution data for class com/acme/BarService does not match.
在研究了这一点之后,jacoco建议确保jacoco代理的
-javaagent
参数是命令行上的第一个javaagent

见关键摘录:

“如果使用另一个Java代理,请确保首先在命令行中指定JaCoCo代理。这样,JaCoCo代理应该可以查看原始类文件。”

注意:jacoco任务将隐式地添加自己的
-javaagent
JVM arg,但在我的例子中,它总是在稍后的命令行中结束

jacoco
-javaagent
参数不是静态的(它在jar引用之后连接了大量选项,这些选项是特定用例的函数),这在某种程度上也使问题变得复杂

下面是我们测试的java调用示例,由gradle生成(为了可读性而缩写并重新格式化):

/usr/lib/jvm/optionopenjdk-11-hotspot-amd64/bin/java\
-Dorg.gradle.native=false\
-javaagent:/path/to/spring-instrument-5.1.5.RELEASE.jar\
-javaagent:/path/to/aspectjweaver-1.9.2.jar\
-javaagent:build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/jacoagent.jar=destfile=build/jacoco/test.exec,append=true,excludes=**/xyz/**:**/com/someother/**:**.zip,inclinlocationclasses=false,dumponexit=true,output=file,jmx=false\
@/tmp/gradle-worker-classpath12976595675824598txt\
-Xmx512m\
-Dfile.encoding=UTF-8-Duser.country=US-Duser.language=en-Duser.variant-ea\
worker.org.gradle.process.internal.worker.GradleWorkerMain
我们正在插入其他JVM
-javaagent
参数,如下所示:

test {
   jacoco {
      enabled = true
   }

   // NOTE: have also tried moving this to other points in the lifecycle (still always end up before jacoco's)
   doFirst {
      configurations.javaAgent.files.each {
         jvmArgs "-javaagent:${it}"
      }
   }
}

工具版本:

  • 爪哇11
  • 梯度6.7.1