Add JVM args to the WorkerExecutor

Hi

I’m trying to add JVM args to the getWorkerExecutor to be able to debug the execution of CustomizeXslTask
by adding this line

config.forkOptions({ options ->
          options.setJvmArgs(["-agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:5005,suspend=y"])
        })

but when adding this line it breaks the code.

package com.xxxxx.build.tasks

import com.xxxxx.build.ProductPluginExtension
import org.gradle.api.Action
import org.gradle.api.file.FileCollection
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.SourceTask
import org.gradle.api.tasks.TaskAction
import org.gradle.workers.IsolationMode
import org.gradle.workers.WorkerConfiguration
import org.gradle.workers.WorkerExecutor
import org.gradle.process.JavaForkOptions

import javax.inject.Inject
import java.lang.reflect.Method

class XSLCustomize extends SourceTask {
  protected final ProductPluginExtension ppExt = project.extensions.getByType(ProductPluginExtension)
  private final WorkerExecutor workerExecutor
  private final JavaPluginConvention javaPlugin = getProject().getConvention().getPlugin(JavaPluginConvention.class)

  @Classpath
  FileCollection classpath = project.files()

  @OutputDirectory
  File destinationDir

  @Input
  String debug = "false"

  @Internal
  boolean fork = true

  @Inject
  WorkerExecutor getWorkerExecutor() {
    throw new UnsupportedOperationException()
  }

  void setClasspath(Collection<FileCollection> configurations) {
    classpath = configurations.inject { a, b -> (a + b) }
  }


  XSLCustomize() {
    super()
    include('**/*.xsl')

    inputs.dir("$ppExt.literatum.litBuildClasses/com/xxxxx/modules/build/xsl")
    inputs.file("$ppExt.literatum.litBuildClasses/com/xxxxx/literatum/util/xml/XslConstants.class")
    inputs.files(javaPlugin.sourceSets.getByName('main').java.sourceDirectories.asFileTree
            .filter { File f -> f.name.equalsIgnoreCase("${project.name}XslConstants.java") })
  }

  @TaskAction
  void process() {
    def filteredCp = classpath.filter {
      !it.name.matches("(.*groovy-all-[0-9.]*|.*slf4j-simple-[0-9.]*|.*slf4j-log4j12-[0-9.]*)\\.jar")
    }

    project.delete("$destinationDir/*")
    project.copy {
      from getSource()
      into destinationDir
    }

    getWorkerExecutor().submit(CXslProcessor, new Action<WorkerConfiguration>() {
      @Override
      void execute(WorkerConfiguration config) {
        config.setIsolationMode(fork ? IsolationMode.PROCESS : IsolationMode.CLASSLOADER)
        config.classpath(filteredCp)
        config.params(destinationDir, project.name, debug)
        config.forkOptions({ options ->
          options.setJvmArgs(["-agentlib:jdwp=transport=dt_socket,server=n,address=127.0.0.1:5005,suspend=y"])
        })
      }
    })
  }

  static class CXslProcessor implements Runnable {
    private final File basePath
    private final String product
    private final String debug

    @Inject
    CXslProcessor(File basePath, String product, String debug) {
      this.basePath = basePath
      this.product = product
      this.debug = debug
    }

    @Override
    void run() {
      Object cXslTask = Class.forName("com.xxxxx.modules.build.ant.CustomizeXslTask").newInstance()

      Method setBasePath = cXslTask.getClass().getMethod("setBasePath", String)
      setBasePath.invoke(cXslTask, basePath.canonicalPath)
      Method setProduct = cXslTask.getClass().getMethod("setProduct", String)
      setProduct.invoke(cXslTask, product)
      Method setDebug = cXslTask.getClass().getMethod("setDebug", String)
      setDebug.invoke(cXslTask, debug)

      Method execute = cXslTask.getClass().getMethod("execute")
      execute.invoke(cXslTask)
    }
  }
}

But it keeps failing with this error, any help.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':product:ux3:customizeXsl'.
> A failure occurred while executing com.xxxxx.build.tasks.XSLCustomize$CXslProcessor
   > Failed to run Gradle Worker Daemon
      > Process 'Gradle Worker Daemon 15' finished with non-zero exit value 2

* 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 ':product:ux3:customizeXsl'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
	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:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
	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.lambda$run$0(DefaultPlanExecutor.java:127)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.xxxxx.build.tasks.XSLCustomize$CXslProcessor
	at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:202)
	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:215)
	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.process.internal.worker.WorkerProcessException: Failed to run Gradle Worker Daemon
	at org.gradle.process.internal.worker.WorkerProcessException.runFailed(WorkerProcessException.java:29)
	at org.gradle.process.internal.worker.DefaultMultiRequestWorkerProcessBuilder$1.start(DefaultMultiRequestWorkerProcessBuilder.java:156)
	at org.gradle.workers.internal.WorkerDaemonStarter.startDaemon(WorkerDaemonStarter.java:72)
	at org.gradle.workers.internal.WorkerDaemonClientsManager.reserveNewClient(WorkerDaemonClientsManager.java:106)
	at org.gradle.workers.internal.WorkerDaemonFactory$1.reserveClient(WorkerDaemonFactory.java:55)
	at org.gradle.workers.internal.WorkerDaemonFactory$1.execute(WorkerDaemonFactory.java:43)
	at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:200)
	... 6 more
Caused by: org.gradle.process.internal.ExecException: Process 'Gradle Worker Daemon 15' finished with non-zero exit value 2
	at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:417)
	at org.gradle.process.internal.worker.DefaultWorkerProcess.onProcessStop(DefaultWorkerProcess.java:141)
	at org.gradle.process.internal.worker.DefaultWorkerProcess.access$000(DefaultWorkerProcess.java:42)
	at org.gradle.process.internal.worker.DefaultWorkerProcess$1.executionFinished(DefaultWorkerProcess.java:94)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy70.executionFinished(Unknown Source)
	at org.gradle.process.internal.DefaultExecHandle.setEndStateInfo(DefaultExecHandle.java:221)
	at org.gradle.process.internal.DefaultExecHandle.finished(DefaultExecHandle.java:357)
	at org.gradle.process.internal.ExecHandleRunner.completed(ExecHandleRunner.java:110)
	at org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:84)
	at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:38)
	... 3 more