2

如何确保-javaagentjacoco 隐式添加的-javaagentJVM 参数出现在命令行上的所有其他 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 的建议是确保-javaagentjacoco 代理的参数是命令行上的第一个 javaagent。

看到这个答案,关键摘录:

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

注意:jacoco 任务将隐式添加自己的-javaagentJVM 参数,但在我的情况下,它总是稍后在命令行上结束。

由于 jacoco-javaagent参数不是静态的(它在 jar 引用之后连接了无数选项,这些选项是特定用例的函数),这也有点复杂化。

这是我们测试的示例 java 调用,由 gradle 生成(为了便于阅读,已缩写并重新格式化):

/usr/lib/jvm/adoptopenjdk-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/jacocoagent.jar=destfile=build/jacoco/test.exec,append=true,excludes=**/xyz/**:**/com/someother/**:**/*.zip,inclnolocationclasses=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
4

0 回答 0