matthiasdenu
matthiasdenu

Reputation: 397

ClassNotFoundException when building with gradle and trying to use com.google.code.gson

I'm new to Java projects and gradle. I'm trying to use Google's GSON to parse a JSON string.

When I navigate to my-project-name/build/classes/main/

I get the ClassNotFoundException when I run

$ java GetGroupMeMessages 

Here is the stack trace (That's what it's called, right?):

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson
    at GetGroupMeMessages.main(GetGroupMeMessages.java:59)
Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson
    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)
    ... 1 more

My build.gradle file looks like this:

apply plugin: 'java'
apply plugin: 'eclipse'

sourceCompatibility = 1.8
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'gscc-groupme-logs',
                   'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.6'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
        flatDir {
            dirs 'repos'
        }
    }
}

I'm doing everything from the command line. I've got my files saved under my-project-name/src/main/java/

Any help is much appreciated! I am stuck.

Upvotes: 2

Views: 4440

Answers (1)

Monzurul Shimul
Monzurul Shimul

Reputation: 8396

If you want to run single java file from command line, you need to provide gson jar as classpath using -cp jar_location in your command.

If you want to run build jar:

change dependencies from compile to runtime in your configuration.

dependencies {
    runtime group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.6'
    runtime group: 'commons-collections', name: 'commons-collections', version: '3.2.2'
    runtime group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

Change your jar config like following:

jar {
    manifest {
    attributes(
            'Implementation-Title': 'gscc-groupme-logs',
            'Implementation-Version': version
            'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
            'Main-Class': 'GetGroupMeMessages'
    )        
    }
}

Then after creating the jar run it using java -jar jarname command.

Upvotes: 1

Related Questions