Java 在已检测的文件上从gradle运行jacoco
我正在为一个java项目尝试jacoco脱机插装 我创建了一个hello world gradle java项目,并用jacoco检测了它生成的类文件。当我试图对这些插入指令的文件运行测试时。我得到以下错误 java.lang.ClassCastException位于CUTest.java:-1 反编译的test.class文件是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
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存储库中的artifactorg.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存储库中的artifactorg.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”执行相同的操作-请不要忘记升级投票并将答案标记为已接受。