Skip to content

ScoverageHtmlWriter fails with NoSuchMethodError #94

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
PeterTCoyote opened this issue Apr 10, 2019 · 6 comments · Fixed by #105
Closed

ScoverageHtmlWriter fails with NoSuchMethodError #94

PeterTCoyote opened this issue Apr 10, 2019 · 6 comments · Fixed by #105

Comments

@PeterTCoyote
Copy link

Hi

The HTML output cannot be generated, because the plugin fails with an error.

Gradle: 5.3.1, Scala 2.11.x, plugin version 3.0.0

The HTML output has to be switched off.

    scoverage {
        coverageOutputHTML = false
    }

Otherwise, the gradle reportScoverage fails with the following error:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':auditability-logging:reportScoverage'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.accept(ExecuteActionsTaskExecuter.java:121)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.accept(ExecuteActionsTaskExecuter.java:117)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:184)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ResolveIncrementalChangesTaskExecuter.execute(ResolveIncrementalChangesTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:92)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:46)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
        at scoverage.report.ScoverageHtmlWriter$$anonfun$classRow$1.apply(ScoverageHtmlWriter.scala:233)
        at scoverage.report.ScoverageHtmlWriter$$anonfun$classRow$1.apply(ScoverageHtmlWriter.scala:233)
        at scala.Option.map(Option.scala:146)
        at scoverage.report.ScoverageHtmlWriter.classRow(ScoverageHtmlWriter.scala:233)
        at scoverage.report.ScoverageHtmlWriter$$anonfun$classesTable$2.apply(ScoverageHtmlWriter.scala:202)
        at scoverage.report.ScoverageHtmlWriter$$anonfun$classesTable$2.apply(ScoverageHtmlWriter.scala:202)
        at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
        at scala.collection.immutable.List.foreach(List.scala:389)
        at scala.collection.TraversableLike.map(TraversableLike.scala:234)
        at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
        at scala.collection.immutable.List.map(List.scala:295)
        at scoverage.report.ScoverageHtmlWriter.classesTable(ScoverageHtmlWriter.scala:202)
        at scoverage.report.ScoverageHtmlWriter.overview(ScoverageHtmlWriter.scala:410)
        at scoverage.report.ScoverageHtmlWriter.write(ScoverageHtmlWriter.scala:31)
        at org.scoverage.ScoverageWriter.write(ScoverageWriter.java:73)
        at org.scoverage.ScoverageWriter$write.call(Unknown Source)
        at org.scoverage.ScoverageReport$_report_closure1.doCall(ScoverageReport.groovy:64)
        at org.scoverage.ScoverageReport$_report_closure1.doCall(ScoverageReport.groovy)
        at org.scoverage.ScoverageRunner.run(ScoverageRunner.groovy:30)
        at org.scoverage.ScoverageRunner$run.call(Unknown Source)
        at org.scoverage.ScoverageReport.report(ScoverageReport.groovy:40)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
...
@maiflai
Copy link
Contributor

maiflai commented Jun 14, 2019

Hi,

Yes, it seems this is the case. I can see a related change in the 3.0 update, but I need to look closer as a simple revert is not fixing my simple test case.

Stu.

@PeterTCoyote
Copy link
Author

Thanks for looking into it.

@maiflai
Copy link
Contributor

maiflai commented Jun 14, 2019

I was unable to reproduce it in an automated test case, but I've published 3.1.4 with the change reverted.

Please could you see if it addresses this issue?

Thanks
Stu

@PeterTCoyote
Copy link
Author

Hi,

I've tried with the 3.1.4, but it fails with or without coverageOutputHTML = false.

plugins {
    id "org.scoverage" version "3.1.4"
}
subprojects {
...
    dependencies {
        scoverage 'org.scoverage:scalac-scoverage-plugin_2.11:1.3.1', 'org.scoverage:scalac-scoverage-runtime_2.11:1.3.1'
    }

    scoverage {
        scoverageScalaVersion = "2.11"
        coverageOutputHTML = false
    }
}

If I issue gradle reportScoverage or gradle build reportScoverage (even with clean build), I'm getting this:

* What went wrong:
Execution failed for task ':<module>:reportScoverage'.
> No signature of method: static scala.collection.JavaConverters.seqAsJavaList() is applicable for argument types: (scala.collection.mutable.ArrayBuffer) values: [ArrayBuffer(/.../build/reports/scoverageTest/scoverage.xml)]

I tried the 3.1.3, but it is failing with the above error.

openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b03)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.212-b03, mixed mode)

And scala 2.11.8 is used in the project.

With 3.0.0 it works okay (except the failure of the writer). Maybe there's some regression around the Scala version? Just guessing.

Kind regards,
Peter

@gslowikowski
Copy link
Member

Hi guys

I have one question. Why are you using different Scala versions for plugin-specific code. My Maven plugin uses Scala 2.12 (see https://github.com/scoverage/scoverage-maven-plugin/blob/master/pom.xml#L99) like SBT 1.x. The code for reports generation (https://github.com/scoverage/scoverage-maven-plugin/blob/master/pom.xml#L99) uses JavaConverters class.

Of course, proper version of scalac-scoverage-runtime dependency is added to the classpath, depending on Scala version used in the project.

@maiflai
Copy link
Contributor

maiflai commented Jun 24, 2019

It is a good question.

Historically it was easier to just use the libraries that are already present, rather than defining a new set of dependencies. It looks like the changes in scoverage 1.4.0 / scala 2.13 will prevent this.

It would be easier if the scoverage plugin used Array instead of Seq.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants