jacoco + gradle 작업을 함께 시도하고 있습니다. 이 포럼을 보면 일부 사람들이 성공적으로이를 수행 한 것으로 보입니다. 그러나 내가 시도했을 때 나는 이상한 예외를 얻었다.jacoco + gradle taskdef org.jacoco.ant.InstrumentTask 클래스에서 필요한 클래스를 찾을 수 없습니다.
내가 무슨 짓을 : http://www.eclemma.org/jacoco/
3.added에서
1.Downloaded Gradle을 2.2.1 및 구성 ENV 변수 등
2.Downloaded jacoco 0.7.1 :
apply plugin: 'jacoco'
및
buildTypes {
debug
{
testCoverageEnabled true
...
,536,913,632 build.gradle 10
4.run Gradle을 찾을 수 없습니다
5.I가 jacoco 에이전트 항아리를 말하는 오류가 발생했습니다 구축 등의 오류 메시지는 C에서 파일을 검색하려고했다 : \ 프로그램 파일 (x86) \ Android \ android-sdk \ extras \ android \ m2repository ... 등
6. 수동으로 jacoco jar 파일의 압축을 풀고 오류 메시지와 오류 메시지가 표시된 위치에 넣습니다. 사라졌다.
7. 그럼 나는 gradle 빌드를 실행했습니다. 실행할 때 나는 다음과 같은 새로운 오류가 발생했습니다 내장 instrumentDebug 작업 : 나는 (내 dev에 기계 승 7) 프로세스 모니터를 사용하는 경우, 내가 org.jacoco.core-0.7에 대한 액세스 권한이 없었다 보았다
Caused by: : taskdef A class needed by class org.jacoco.ant.InstrumentTask cannot be found: org/jacoco/core/runtime/IExecutionDataAccessorGenerator using the classloader AntClassLoader[C:\Program Files (x86)\Android\android-sdk\extras\android\m2repository\org\jacoco\org.jacoco.ant\0.7.1.201405082137\org.jacoco.ant-0.7.1.201405082137.jar]
at org.apache.tools.ant.taskdefs.Definer.addDefinition(Definer.java:612)
at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:237)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:77)
at org.gradle.api.internal.project.ant.BasicAntBuilder.doInvokeMethod(BasicAntBuilder.java:92)
at com.android.build.gradle.internal.coverage.JacocoInstrumentTask.instrument(JacocoInstrumentask.groovy:51)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
Caused by: java.lang.ClassNotFoundException:
at org.jacoco.core.runtime.IExecutionDataAccessorGenerator
at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1366)
at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1315)
at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1068)...
.1.201405082137.jar, org.jacoco.ant.InstrumentTask 클래스가 상주합니다. 따라서 그라디언트가 org.apache.tools.ant.AntClassLoader 파일 경로를 올바르게 전달하지 않았다고 생각합니다.
내가 방법을 아래에 시도했지만 그들 중 누구도 일하지 :
- 는 CLASSPATH 환경 변수에 모든 jacoco jar 파일을 추가합니다.
- jacoco jar 파일을 ant libs, gradle libs, gradle libs/plugins 폴더에 추가하십시오.
- gradle 2.2.1의 소스 코드를 살펴보십시오. 이 순간에 우둔 ...
누구든지이 문제를 해결하는 방법을 알고 있습니까?
미리 감사드립니다.
편집 :
주요 목적이다 :
2. 수동으로 APK 파일을 테스트 계장 APK 파일을 구축 jacoco
1하자 (하지 자동 테스트)
3.jacoco 취재 보고서 생성하자
업데이트 : InstrumentDebug 작업 실행의 Gradle을 명령 아래에 새로운 프로세스를 시작할 때 난 그냥 발견
"C : \ 프로그램 파일 \ 자바 \ jdk1.8.0_25 \ bin \ java.exe "-XX : MaxPermSize = 512m -Xmx2048m -Dfile.encoding = UTF-8 -Duser.country = CN -Duser.language = zh -Duser.variant -cp D : \ gradle-2.2.1 \ gradle-2.2.1 \ lib \ gradle-launcher-2.2.1.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.2.1 D : \ gradle-2.2.1 \ gradle-2.2.1 \ daemon 120000 744501ac- 32c1-4930-82bd-59e0a9e2b92d -XX : MaxPermSize = 512m -Xmx2048m -Dfile.encoding = UTF-8 -Duser.country = CN -Duser.language = zh -Duser.variant
클래스 경로가 하드 코딩되어있어 환경 변수에 정의 된 것을 덮어 씁니다. 따라서 jacoco의 필수 코어 lib를 찾을 수 없으므로이 문제가 발생합니다. 이제이 프로세스가 시작된 곳과 -cp 옵션을 변경하는 방법이 있는지 확인하려고합니다.
업데이트 2 : 이 프로세스는 gradle-launcher-2.2.1.jar에 의해 시작되었습니다. 아래 코드를 참조하십시오. 지금은 DefaultModuleRegistry를 변경하고 registry.getGradleHome()을 == null로 만들 수 있는지 여부를 확인하려고합니다. 그동안 jacoco + gradle을 성공적으로 사용한 사람이라면 어느 버전의 gradle을 사용하고 있습니까?
public DaemonStartupInfo startDaemon()
{
DefaultModuleRegistry registry = new DefaultModuleRegistry();
Set<File> bootstrapClasspath = new LinkedHashSet();
bootstrapClasspath.addAll(registry.getModule("gradle-launcher").getImplementationClasspath().getAsFiles());
if (registry.getGradleHome() == null)
{
bootstrapClasspath.addAll(registry.getFullClasspath());
}
if (bootstrapClasspath.isEmpty()) {
throw new IllegalStateException("Unable to construct a bootstrap classpath when starting the daemon");
}
new JvmVersionValidator().validate(this.daemonParameters);
List<String> daemonArgs = new ArrayList();
daemonArgs.add(this.daemonParameters.getEffectiveJavaExecutable());
List<String> daemonOpts = this.daemonParameters.getEffectiveJvmArgs();
LOGGER.debug("Using daemon opts: {}", daemonOpts);
daemonArgs.addAll(daemonOpts);
daemonArgs.add("-cp");
daemonArgs.add(CollectionUtils.join(File.pathSeparator, bootstrapClasspath));
daemonArgs.add(GradleDaemon.class.getName());
daemonArgs.add(GradleVersion.current().getVersion());
daemonArgs.add(this.daemonDir.getBaseDir().getAbsolutePath());
daemonArgs.add(String.valueOf(this.daemonParameters.getIdleTimeout()));
daemonArgs.add(this.daemonParameters.getUid());
...
}
지면 가이드 (34 장)를 따라 보았습니까 : http://www.gradle.org/docs/current/userguide/jacoco_plugin.html. 나는 Gradle 2.2.1을 사용하지 않았지만, "unit tests"를 사용하거나 "integration/acceptance/Selenium/etc GUI 테스트"를 사용하여 주요 소스 코드의 코드 커버리지를 얻으려고합니까? UNIT 테스트를 사용하는 경우 Gradle은 "gradle clean build"를 실행할 때 무료로 수행합니다. 비 - 유닛 테스트를 사용하여 주요 소스 코드의 코드 범위를 원할 경우 jacocoagent를 대상 JVM에 첨부해야합니다 (예 : 대상 서버의 Tomcat JVM에서 응용 프로그램의 .war가 실행되는 경우). –
또한 build.gradle을 붙여 넣으십시오. –
@ ArunSangal, 답장을 보내 주셔서 감사합니다. 나는 나의 목적을 업데이트했다. 나는 이제 # 1에 머물렀다. 내 build.gradle에는 특별한 것이 없습니다. 방금 언급 한 3 단계를 추가했습니다. –