Search code examples
gradlegretty

NoClassDefFoundError when starting Gretty in Gradle build


When I am trying to start Gretty using gradle appRun and Gradle 2.9 I get the following error.

Exception in thread "main" java.lang.NoClassDefFoundError: groovy/json/JsonSlurper
    at org.akhikhl.gretty.Runner.run(Runner.groovy:114)
    at org.akhikhl.gretty.Runner.this$2$run(Runner.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:71)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at org.akhikhl.gretty.Runner.main(Runner.groovy:46)
Caused by: java.lang.ClassNotFoundException: groovy.json.JsonSlurper
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more
Exception in thread "Thread-3" org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
    at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:367)
    at org.gradle.process.internal.DefaultJavaExecAction.execute(DefaultJavaExecAction.java:31)
    at org.gradle.api.internal.file.DefaultFileOperations.javaexec(DefaultFileOperations.java:159)
    at org.gradle.api.internal.project.AbstractProject.javaexec(AbstractProject.java:792)
    at org.gradle.api.internal.project.AbstractProject.javaexec(AbstractProject.java:788)
    at org.gradle.api.Project$javaexec$10.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at org.akhikhl.gretty.DefaultLauncher.javaExec(DefaultLauncher.groovy:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
    at org.akhikhl.gretty.LauncherBase$_launchThread_closure4.doCall(LauncherBase.groovy:240)
    at org.akhikhl.gretty.LauncherBase$_launchThread_closure4.doCall(LauncherBase.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
    at groovy.lang.Closure.call(Closure.java:426)
    at groovy.lang.Closure.call(Closure.java:420)
    at groovy.lang.Closure.run(Closure.java:507)
    at java.lang.Thread.run(Thread.java:745)

My application does not require groovy-json at all and I suspect it's required by the Gretty Gradle plugin but I cannot find the problem. Here is what I tried yet:

Applied gretty.plugin from a local location and add groovy-json as a classpath dependency of the buildscript.

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'org.akhikhl.gretty:gretty:1.2.4'
    classpath "org.codehaus.groovy:groovy-json:${groovyVersion}"
  }
}

repositories {
  jcenter()
}

dependencies {
   // does not affect the situation either 
   runtime "org.codehaus.groovy:groovy-json:${groovyVersion}"
}

if (!project.plugins.findPlugin(org.akhikhl.gretty.GrettyPlugin))
  project.apply(plugin: org.akhikhl.gretty.GrettyPlugin)

It doesn't change whether I use Jetty 9 or Tomcat 8. It always results in the same error.

I have found the reason for this behaviour.

In my buildscript I make sure that groovy-all never gets used and is replaced by groovy module (see below).

configurations.all {
        resolutionStrategy {

            eachDependency { DependencyResolveDetails details ->
                //changing 'groovy-all' into 'groovy':
                if (details.requested.name == 'groovy-all') {
                    details.useTarget group: details.requested.group, name: 'groovy', version: groovyVersion
                }
        }
}

So that's the reason why the error occurs. But can anyone tell me why I does not get fixed when I add groovy-json as runtime dependency?


Solution

  • I ran into the same problem. Didn't solve it completely yet, but this seems to help:

    What the say essentially is that deps for grettyplugin itself must be added with the keyword gretty (not compile nor runtime)

    compile group: 'org.apache.poi', name: 'ooxml-schemas', version: '1.3'
    
    runtime group: 'org.postgresql', name: 'postgresql', version: '9.4.1209.jre7'
    
    gretty 'com.atomikos:transactions-jta:4.0.4'
    

    Hope this helps someone else (took me quite a while to figure it out).