iCoder
iCoder

Reputation: 1524

Gradle - Run Task for Multiple java programs within a project

Need: To create a run task each, for multiple programs within the same project

Based on the solution suggested in this LINK. I tried as shown below.

Working Code:

task runCustom1(type: JavaExec) {
    group = 'Z_Custom_Run'
    description = 'Testing for Gradle Run'

    classpath sourceSets.main.runtimeClasspath
    main = "pkg01.TestGradleRun"
}

task runCustom2(type: JavaExec) {
    group = 'Z_Custom_Run'
    description = 'Testing for Gradle Run'

    classpath sourceSets.main.runtimeClasspath
    main = "pkg01.TestGradleRun2"
}

But above method is cumbersome, as I have to generate for many programs & hence tried the below, to see if I can keep the code compact. But it gives an error as shown below.

Trial Code:

def customRunTask(String className, String packagePath){
    return tasks.create("run${className}", JavaExec){
            group = 'zCustomRun'
            description = 'Testing for Gradle Run'

            classpath sourceSets.main.runtimeClasspath
            main = packagePath
    }
}

artifacts {
    archives customRunTask("Test1","pkg01.TestGradleRun"),
             customRunTask("Test2","pkg01.TestGradleRun2")
}

Error:

A problem occurred evaluating root project 'testJavaFeatures'.
> Cannot convert the provided notation to an object of type ConfigurablePublishArtifact: task ':runTest1'.
  The following types/formats are supported:
    - Instances of ConfigurablePublishArtifact.
    - Instances of PublishArtifact.
    - Instances of AbstractArchiveTask, for example jar.
    - Instances of Provider<RegularFile>.
    - Instances of Provider<Directory>.
    - Instances of Provider<File>.
    - Instances of RegularFile.
    - Instances of Directory.
    - Instances of File.
    - Maps with 'file' key

Since I am not too conversant with Gradle, seek guidance from the experts on how to fix the error & get it working

Upvotes: 0

Views: 427

Answers (2)

injecteer
injecteer

Reputation: 20707

Not sure what you try to do, but you can generate similar tasks en masse very easily:

List mainClassNames = [ 'pkg01.TestGradleRun', 'pkg01.TestGradleRun2' ]

mainClassNames.each{ name ->

  task "runCustom-$name"(type: JavaExec) {
    group = 'Z_Custom_Run'
    description = "Testing for Gradle Run for $name"

    classpath sourceSets.main.runtimeClasspath
    main = name
  }
}

artifacts {
    archives mainClassNames.collect{ ":runCustom-$it" }
}

Upvotes: 0

PrasadU
PrasadU

Reputation: 2438

you were almost there ... the below should work

def customRunTask(String className, String packagePath){
    return tasks.create("run${className}", JavaExec){
        group = 'zCustomRun'
        description = 'run ${packagePath}.${className}'

        classpath sourceSets.main.runtimeClasspath
        main = packagePath + '.' + className
    }
}

customRunTask('ClassA', 'com.pkg1')
customRunTask('ClassB', 'com.pkg2')

(and remove the artifacts section, from your file)

Upvotes: 1

Related Questions