java.lang.NoClassDefFoundError: when trying to run jar

27,900

Solution 1

This is because your dependencies are not included into the end jar file.

Take a look on the examples here or here.

Or alternatively use ./gradlew clean build that should automatically pack the app correctly. Take a look on the official guide

Solution 2

  1. Define a task called fatJar in build.gradle:
jar {
    baseName = 'base-name'
    version = '0.1.0'
    manifest {
        attributes(
                'Main-Class': 'com.github:'
        )
    }
}

task fatJar(type: Jar) {
    manifest.from jar.manifest
//    classifier = 'all'
    from {
        configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
    } {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    with jar
}

artifacts {
    archives fatJar
}
  1. Run gradle fatJar or ./gradlew fatJar to generate a jar file with all dependencies, which can run independently but may be pretty large in size (that's why it's called a fat jar).
Share:
27,900
Quillion
Author by

Quillion

I love programming. At this point programming for me is essential part of everyday life! It has become essential extension of me and regardless of what I do I can not be thinking about programming. And I love it!!! My kids ask me what programming is, and I say: Programming is like being a magician, you write a spell and it does magic.

Updated on January 19, 2020

Comments

  • Quillion
    Quillion over 4 years

    I have a spring boot project using gradle

    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'jetty'
    apply plugin: 'war'
    apply plugin: 'org.springframework.boot'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web:1.5.1.RELEASE") {
            exclude module: "spring-boot-starter-tomcat"
        }
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-jetty', version: '1.5.1.RELEASE'
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.1.RELEASE'
        compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.6.RELEASE'
        compile group: 'org.springframework', name: 'spring-context-support', version: '4.3.6.RELEASE'
        compile group: 'org.springframework', name: 'spring-orm', version: '4.3.6.RELEASE'
        compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
        compile group: 'org.freemarker', name: 'freemarker', version: '2.3.23'
        compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.5'
        compile group: 'org.hibernate', name: 'hibernate-core', version: '5.1.4.Final'
        compile group: 'commons-validator', name: 'commons-validator', version: '1.5.1'
        compile group: 'junit', name: 'junit', version: '4.12'
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.1.RELEASE'
    }
    
    task wrapper(type: Wrapper) {
        gradleVersion = '2.2'
    }
    
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.1.RELEASE")
        }
    }
    
    jar {
        baseName = 'base-name'
        version = '0.1.0'
        manifest {
            attributes 'Main-Class': 'some.application.Application'
        }
    }
    
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    

    I build using
    ./gradlew clean jar
    Then try to run using
    java -jar <jar-name>.jar

    However I get an error saying

    Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
            at some.application.Application.main(Application.java:11)
    Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
            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
    

    I am so confused as to why I can run it in IDE but not as a jar. Also I found out that my jar doesn't contain any libraries at all.

    EDIT:

    This is my Application.class

    package some.application;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application
    {
        public static void main(String[] args)
        {
            SpringApplication.run(Application.class, args);
        }
    }
    
  • Quillion
    Quillion about 7 years
    beautiful. Adding from { (configurations.runtime).collect { it.isDirectory() ? it : zipTree(it) } } worked like a charm for me :) thank you!