GarethReid
GarethReid

Reputation: 418

Gradle build not including source/src groovy

I am trying to create a jar from a basic program.

Problem is when I run and/or inspec the jar file my sclasses from src/** are not included! (all the dependencies are perfect)

What is the problem here?

UPDATE

When I add: from files(fileTree(dir: 'src')) to the task it includes the .groovy files :(

When I add

from sourceSets.main.output.classesDir

to the task and:

sourceSets {
    main {
        groovy {
            srcDir 'src'
        }
    }
}

They do not get included :( Can't find any other ways....

Upvotes: 1

Views: 10095

Answers (4)

GarethReid
GarethReid

Reputation: 418

Final working build.gradle. (thanks all).

    apply plugin: 'application'
    apply plugin: 'groovy'

    version = '1.0'

    repositories {
        mavenCentral();
    }

    dependencies
        {
            compile files (fileTree(dir: 'lib', include: ['*.jar']),
                fileTree(dir: 'lib/DocxDep', include: ['*.jar']))
            compile 'org.codehaus.groovy:groovy-all:2.3.6'  //Was missing
        }

    task buildLabServicesJar(type: Jar) {
        from files(sourceSets.main.output)   //Was missing/wrong      
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
        configurations.runtime.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    with jar

    sourceSets.main.groovy {
        srcDirs = [ 'src' ] //Was missing/wrong
    } 

    manifest {
        attributes 'Implementation-Title': 'Lab Services',
            'Implementation-Version': version,
            'Main-Class': 'org.petermac.clarity.ClarityServices'
        }
    }

Upvotes: 4

GarethReid
GarethReid

Reputation: 418

You must excuse me but I have recently crossed over from a long life of Microsoft and am still learning. I am surprised by the lack of blogs and example code of basic stuff, what I am doing is so standard....(I will be posting one once/if I figure this out)

Note: Intellij -> Build -> Build Artifacts works perfectly but I would like to move this to Bamboo.

anyway taking into account everyone's ideas, here is my file (and error)

     apply plugin: 'groovy'
    version = '1.0'

    repositories {
        mavenCentral();
    }

    dependencies
    {
        compile files (fileTree(dir: 'lib', include: ['*.jar']),
                fileTree(dir: 'lib/DocxDep', include: ['*.jar']))
    }
    //println "Classes dir: " + sourceSets.main.groovy


    task buildLabServicesJar(type: Jar) {
        from files(sourceSets.main.output)
        //from sourceSets.main.groovy.output
        //from files(fileTree(dir: 'src'))        
        from {
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
            configurations.runtime.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }

        manifest {
            attributes 'Implementation-Title': 'Lab Services',
                    'Implementation-Version': version,
            'Main-Class': 'org.petermac.clarity.ClarityServices'
        }
    }

    sourceSets {
        main {
            groovy.srcDirs = [ 'src' ]
        }
    }

ERROR:Cannot infer Groovy class path because no Groovy Jar was found on class path: configuration ':compile'

And if I change src line to: srcDirs = [ 'src/**' ] It builds but leaves out all my source again.

Upvotes: -1

Rene Groeschke
Rene Groeschke

Reputation: 28663

referencing sourceSets.main.output.classesDir in your jar task means that it will just copy everything from that directory in your jar. The problem is that when you run gradle buildLabServicesJar nothing tells gradle that the classes should be compiled first. That's why the directory keeps to be empty and your jar doesn't contain the compiled classes. If you modify your task declaration from

task buildLabServicesJar(type: Jar) {
    from files(sourceSets.main.output.classesDir)
    ...
}

to

task buildLabServicesJar(type: Jar) {
    from files(sourceSets.main.output)
    ...
}

task autowiring kicks in. task autowiring means that if you declare an output of one task as input to another task (your buildLabServicesJar) gradle knows that it must generate the output first (run the compile task for example).

hope that helps!

Upvotes: 1

Mark Vieira
Mark Vieira

Reputation: 13486

By default, Gradle looks for source in src/main/groovy when the 'groovy' plugin in applied. You'll need to either restructure your project or configure your source sets to appropriately reflect your project structure.

Upvotes: 5

Related Questions