Search code examples
javagradlegroovygrgit

grgit NoClassDefFoundError


Gradle throws a NoClassDefFoundError when trying to execute a grgit task.

Start of build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'org.ajoberstar:gradle-git:1.2.0'
    }
}

apply plugin: 'com.android.application'
//
//

import org.ajoberstar.grgit.*

task clone << {
    File dir = new File('contrib/otherstuff')
    if(!dir.exists()) {
        def grgit = Grgit.clone(dir: dir, uri: 'https://github.com/someguy/otherstuff.git')
    }
    // TODO else (pull)
}


project.afterEvaluate {
    preBuild.dependsOn clone
}

// rest omitted

Output:

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0
:src:myproject:clone FAILED

FAILURE: Build failed with an exception.

* Where:
Build file '/home/me/src/myproject/build.gradle' line: 20

* What went wrong:
Execution failed for task ':src:myproject:clone'.
> java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/typehandling/ShortTypeHandling

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 16.937 secs

Line 20 is the call to Grgit.clone().

Do I need to add groovy as a build dependency (which the error message seems to indicate)? How and where would I add it?

EDIT: gradle version is 1.10, if it matters.


Solution

  • I’ve managed to solve it.

    grgit-1.2.0 appears to depend on groovy. Adding a classpath entry for groovy in the buildscript/dependencies block resulted in a different error:

    Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0
    :src:myproject:clone FAILED
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Build file '/home/me/src/myproject/build.gradle' line: 23
    
    * What went wrong:
    Execution failed for task ':src:myproject:clone'.
    > java.lang.IncompatibleClassChangeError: the number of constructors during runtime and compile time for org.ajoberstar.grgit.auth.AuthConfig$Option do not match. Expected -1 but got 2
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
    
    BUILD FAILED
    
    Total time: 12.295 secs
    

    Further research revealed that this might stem from a version incompatibility (as I’m stuck with Gradle 1.10 for other reasons).

    Eventually I solved it by going back to grgit-0.7.0. Now my git task works and the repo gets cloned.