marytts / gradle-marytts-voicebuilding-plugin

A replacement for the legacy VoiceImportTools in MaryTTS
http://mary.dfki.de/
GNU General Public License v3.0
16 stars 12 forks source link

Transitive Groovy dependency leak #95

Closed psibre closed 6 years ago

psibre commented 6 years ago

groovy-all leaks into the classpath from a transitive dependency:

> Task :buildEnvironment 

------------------------------------------------------------
Root project
------------------------------------------------------------

classpath
+--- de.dfki.mary.voicebuilding-legacy:de.dfki.mary.voicebuilding-legacy.gradle.plugin:5.3
|    \--- gradle.plugin.de.dfki.mary:gradle-marytts-voicebuilding-plugin:5.3
|         +--- de.dfki.mary:marytts-runtime:5.2
|         |    +--- de.dfki.mary:marytts-common:5.2
|         |    |    +--- commons-lang:commons-lang:2.6
|         |    |    +--- commons-io:commons-io:2.5
|         |    |    +--- log4j:log4j:1.2.16
|         |    |    +--- com.twmacinta:fast-md5:2.7.1
|         |    |    \--- org.codehaus.groovy:groovy-all:2.4.5
|         |    +--- de.dfki.mary:marytts-signalproc:5.2
|         |    |    +--- de.dfki.mary:marytts-common:5.2 (*)
|         |    |    +--- gov.nist.math:Jampack:1.0
|         |    |    +--- gov.nist.math:jama:1.0.3
|         |    |    \--- org.swinglabs:swing-layout:1.0.3
|         |    +--- com.ibm.icu:icu4j:54.1.1
|         |    +--- commons-lang:commons-lang:2.6
|         |    +--- commons-collections:commons-collections:3.2.2
|         |    +--- de.dfki.mary:emotionml-checker-java:1.1
|         |    +--- de.dfki.lt.jtok:jtok-core:1.9.3
|         |    |    +--- org.slf4j:slf4j-api:1.6.1
|         |    |    +--- log4j:log4j:1.2.16
|         |    |    \--- org.slf4j:slf4j-log4j12:1.6.1
|         |    |         +--- org.slf4j:slf4j-api:1.6.1
|         |    |         \--- log4j:log4j:1.2.16
|         |    +--- com.google.guava:guava:14.0.1
|         |    +--- net.sf.trove4j:trove4j:2.0.2
|         |    +--- org.apache.httpcomponents:httpcore:4.1
|         |    +--- org.apache.httpcomponents:httpcore-nio:4.1
|         |    |    \--- org.apache.httpcomponents:httpcore:4.1
|         |    +--- org.apache.opennlp:opennlp-maxent:3.0.3
|         |    +--- org.apache.opennlp:opennlp-tools:1.5.3
|         |    |    +--- org.apache.opennlp:opennlp-maxent:3.0.3
|         |    |    \--- net.sf.jwordnet:jwnl:1.3.3
|         |    \--- org.hsqldb:hsqldb:2.0.0
|         \--- org.m2ci.msp:gradle-praat-wrapper-plugin:0.5.1
\--- de.dfki.mary.voicebuilding-festvox:de.dfki.mary.voicebuilding-festvox.gradle.plugin:5.3
     \--- gradle.plugin.de.dfki.mary:gradle-marytts-voicebuilding-plugin:5.3 (*)

(*) - dependencies omitted (listed previously)

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

This happens despite excluding it from the immediate marytts-runtime dependency!

As a result, applying this plugin at v5.3 causes fatal errors when the Gradle Worker API is invoked:

$ ./gradlew wav -s

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':wav'.
> Multiple task action failures occurred:
   > A failure occurred while executing de.dfki.mary.voicebuilding.tasks.RunnableExec
      > Could not create an instance of type de.dfki.mary.voicebuilding.tasks.RunnableExec.
         > Could not initialize class groovy.lang.GroovySystem
   > A failure occurred while executing de.dfki.mary.voicebuilding.tasks.RunnableExec
      > Could not create an instance of type de.dfki.mary.voicebuilding.tasks.RunnableExec.
         > Could not initialize class groovy.lang.GroovySystem
   > A failure occurred while executing de.dfki.mary.voicebuilding.tasks.RunnableExec
      > Could not create an instance of type de.dfki.mary.voicebuilding.tasks.RunnableExec.
         > Could not initialize class groovy.lang.GroovySystem

[...]

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':wav'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
        at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
        at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:623)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:578)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
        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: org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$MultipleTaskActionFailures: Multiple task action failures occurred:
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:147)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
        ... 30 more
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing de.dfki.mary.voicebuilding.tasks.RunnableExec
        at org.gradle.workers.internal.DefaultWorkerExecutor$2.waitForCompletion(DefaultWorkerExecutor.java:143)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:99)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.access$000(DefaultAsyncWorkTracker.java:34)
        at org.gradle.internal.work.DefaultAsyncWorkTracker$2.run(DefaultAsyncWorkTracker.java:83)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:196)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withoutProjectLock(DefaultWorkerLeaseService.java:145)
        at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:79)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:132)
        ... 36 more
Caused by: org.gradle.api.reflect.ObjectInstantiationException: Could not create an instance of type de.dfki.mary.voicebuilding.tasks.RunnableExec.
        at org.gradle.api.internal.DependencyInjectingInstantiator.newInstance(DependencyInjectingInstantiator.java:90)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:35)
        at org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:46)
        at org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:30)
        at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:100)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146)
        at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128)
        at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
        ... 3 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class groovy.lang.GroovySystem
        at de.dfki.mary.voicebuilding.tasks.RunnableExec.$getStaticMetaClass(RunnableExec.groovy)
        at de.dfki.mary.voicebuilding.tasks.RunnableExec.<init>(RunnableExec.groovy)
        at org.gradle.api.internal.DependencyInjectingInstantiator.newInstance(DependencyInjectingInstantiator.java:81)
        ... 12 more

* Get more help at https://help.gradle.org

BUILD FAILED in 0s
2 actionable tasks: 1 executed, 1 up-to-date
psibre commented 6 years ago

This was not caught before, since in the functional testing environment, the leaked groovy-all doesn't clash with the local version in Gradle. Moreover, various internal voicebuilding projects resolved the plugin from the buildscript classpath using a buildSrc submodule containing this repository.

Workaround

Consequently, this bug can be worked around by running

$ git submodule add https://github.com/marytts/gradle-marytts-voicebuilding-plugin.git buildSrc

or some equivalent hack.

psibre commented 6 years ago

As it turns out, the issue persists when the plugin is resolved from the Gradle plugins portal, but not if it is resolved from Bintray.

As a workaround, use this in a consuming project's settings.gradle:

pluginManagement.repositories {
    maven {
        url 'https://dl.bintray.com/marytts/marytts'
    }
    gradlePluginPortal()
}
psibre commented 6 years ago

So this issue is actually a side-effect of the manner in which the different plugin publishing methods insert dependency exclusions in the generated POMs. v5.3.1 does not solve this issue when resolving from the Gradle plugin portal, and using the workaround of resolving the plugin from Bintray works just as well with v5.3.

But v5.3.2 solves this issue.