java.lang.NoClassDefFoundError: when trying to run jar
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
- Define a task called
fatJar
inbuild.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
}
- Run
gradle fatJar
or./gradlew fatJar
to generate ajar
file with all dependencies, which can run independently but may be pretty large in size (that's why it's called a fat jar).
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, 2020Comments
-
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 about 7 yearsbeautiful. Adding
from { (configurations.runtime).collect { it.isDirectory() ? it : zipTree(it) } }
worked like a charm for me :) thank you!