Java 在已检测的文件上从gradle运行jacoco

Java 在已检测的文件上从gradle运行jacoco,java,gradle,jacoco,Java,Gradle,Jacoco,我正在为一个java项目尝试jacoco脱机插装 我创建了一个hello world gradle java项目,并用jacoco检测了它生成的类文件。当我试图对这些插入指令的文件运行测试时。我得到以下错误 java.lang.ClassCastException位于CUTest.java:-1 反编译的test.class文件是 import org.junit.Test; public class CUTest { public CUTest() { arrayOfBool

我正在为一个java项目尝试jacoco脱机插装

我创建了一个hello world gradle java项目,并用jacoco检测了它生成的类文件。当我试图对这些插入指令的文件运行测试时。我得到以下错误

java.lang.ClassCastException位于CUTest.java:-1

反编译的test.class文件是

import org.junit.Test;

public class CUTest
{
  public CUTest()
  {
    arrayOfBoolean[0] = true;
  }

  @Test
  public void test()
  {
    boolean[] arrayOfBoolean = $jacocoInit();CUT localCUT1 = new CUT();arrayOfBoolean[1] = true;
    CUT c;
    c.meth();
    arrayOfBoolean[2] = true;
  }
}
import java.io.PrintStream;

public class CUT
{
  public CUT()
  {
    arrayOfBoolean[0] = true;
  }

  public void meth()
  {
    boolean[] arrayOfBoolean = $jacocoInit();System.out.println("hello world");
    arrayOfBoolean[1] = true;
  }
}
检测的源。类文件为

import org.junit.Test;

public class CUTest
{
  public CUTest()
  {
    arrayOfBoolean[0] = true;
  }

  @Test
  public void test()
  {
    boolean[] arrayOfBoolean = $jacocoInit();CUT localCUT1 = new CUT();arrayOfBoolean[1] = true;
    CUT c;
    c.meth();
    arrayOfBoolean[2] = true;
  }
}
import java.io.PrintStream;

public class CUT
{
  public CUT()
  {
    arrayOfBoolean[0] = true;
  }

  public void meth()
  {
    boolean[] arrayOfBoolean = $jacocoInit();System.out.println("hello world");
    arrayOfBoolean[1] = true;
  }
}
jacoco代理jar位于类路径上。我在build.gradle中为它添加了一个测试编译依赖项

这是源文件(不是反编译的类文件)

测试源

import static org.junit.Assert.*;

import org.junit.Test;

public class CUTest {

    @Test
    public void test() {
        CUT c = new CUT();
        c.meth();
    }

}
我使用jacocoinstrumentationapi来处理编译这些类后生成的类文件。 我想从这些.class文件(已检测)生成jacoco报告

以下是hello world和instrumentation的项目

使用提交时的示例
f4786df19a930726ebada97461d2a54ad463a4ec
,如
自述文件.md
所述:

从build.gradle中取消对gradle.taskGraph.beforeTask的注释

但是在

获取JACOCORAT\build\classes中的文件,并对使用JACOCOInstrumentation api的文件进行指令插入,用指令插入的类替换类

使用at提交
5e7ac40627eb4e2f0882ce143f5840ee9774af57
,这需要

将根目录更改为类文件夹的绝对路径

我的情况就是这样

public static final String ROOT = "/tmp/jacoco-rat/build/classes/";
得到

因此,将其用于(将在下一版本中提供)仪器类:

java -jar jacococli.jar instrument build/classes --dest build/instrumented
并替换了原件:

rm -r build/classes
mv build/instrumented build/classes
然后以
gradletest--info
的形式再次执行Gradle,并看到异常不是
java.lang.ClassCastException
,而是

java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_8ff85ea/Offline
    at com.exp.tools.CUTest.$jacocoInit(CUTest.java)
    at com.exp.tools.CUTest.<init>(CUTest.java)

    Caused by:
    java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_8ff85ea.Offline
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 2 more
Maven存储库中的artifact
org.jacoco:org.jacoco.agent
不是实际的代理,而是获取它的API。实际代理具有分类器
运行时
,即代替

testCompile group: 'org.jacoco', name: 'org.jacoco.agent', version: '0.7.9'
你绝对应该使用

testCompile group: 'org.jacoco', name: 'org.jacoco.agent', classifier: 'runtime', version: '0.7.9'
并修复可能错误使用JACOAPI导致
java.lang.ClassCastException
的问题,或使用已经开发的标准JaCoCo工具进行插装,如上述即将推出的命令行界面,

从build.gradle中取消对gradle.taskGraph.beforeTask的注释

但是在

获取JACOCORAT\build\classes中的文件,并对使用JACOCOInstrumentation api的文件进行指令插入,用指令插入的类替换类

使用at提交
5e7ac40627eb4e2f0882ce143f5840ee9774af57
,这需要

将根目录更改为类文件夹的绝对路径

我的情况就是这样

public static final String ROOT = "/tmp/jacoco-rat/build/classes/";
得到

因此,将其用于(将在下一版本中提供)仪器类:

java -jar jacococli.jar instrument build/classes --dest build/instrumented
并替换了原件:

rm -r build/classes
mv build/instrumented build/classes
然后以
gradletest--info
的形式再次执行Gradle,并看到异常不是
java.lang.ClassCastException
,而是

java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_8ff85ea/Offline
    at com.exp.tools.CUTest.$jacocoInit(CUTest.java)
    at com.exp.tools.CUTest.<init>(CUTest.java)

    Caused by:
    java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_8ff85ea.Offline
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 2 more
Maven存储库中的artifact
org.jacoco:org.jacoco.agent
不是实际的代理,而是获取它的API。实际代理具有分类器
运行时
,即代替

testCompile group: 'org.jacoco', name: 'org.jacoco.agent', version: '0.7.9'
你绝对应该使用

testCompile group: 'org.jacoco', name: 'org.jacoco.agent', classifier: 'runtime', version: '0.7.9'

并修复可能错误使用JACOAPI导致
java.lang.ClassCastException
的问题,或者使用已经开发的标准JaCoCo工具进行插装,如上面提到的即将推出的命令行界面,,。

源文件未编译。请提供最小、完整和可验证的示例-这些是jacoco检测的反编译.class文件。现在还添加了源代码。这仍然不足以重现您的问题。你对乐器课有什么看法?具体如何执行?如何准确地创建报表?我在一个单独的java项目中使用了JacoCoAPI来插入类文件。明天我将在github上上传这两个项目并在这里共享路径。我使用的方法正确吗。有没有办法在磁盘上已经插入指令的类文件上运行jacoco?我正在使用gradle编译java类。然后获取生成的类文件,并在外部插入它们以将它们放回原处。然后我使用gradle再次运行测试用例。源文件无法编译。请提供最小、完整和可验证的示例-这些是jacoco检测的反编译.class文件。现在还添加了源代码。这仍然不足以重现您的问题。你对乐器课有什么看法?具体如何执行?如何准确地创建报表?我在一个单独的java项目中使用了JacoCoAPI来插入类文件。明天我将在github上上传这两个项目并在这里共享路径。我使用的方法正确吗。有没有办法在磁盘上已经插入指令的类文件上运行jacoco?我正在使用gradle编译java类。然后获取生成的类文件,并在外部插入它们以将它们放回原处。然后我使用gradle再次运行测试用例,我将等待jacoccli.jar发布。它不在maven上。它是否可以通过其他渠道获得?@Arpit您可以从源代码构建,或从snapshot maven存储库下载-请参阅主页的下载链接和文档中指向snapshot存储库的链接。您也可以使用Ant任务“instrument”同样,请不要忘记升级投票并将答案标记为已接受。我将等待jacoccli.jar发布。它不在maven上。它是否可以通过其他渠道获得?@Arpit您可以从源代码构建,或者从snapshot maven存储库下载-请参阅主页的下载链接和文档中指向快照存储库的链接。您也可以使用Ant任务“instrument”执行相同的操作-请不要忘记升级投票并将答案标记为已接受。