Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"NoClassDefFoundError: GenericApplicationListener" when switching from Spring Boot 1.3.0M1 to 1.3.0M2

In my Spring Starter created Soring Boot application I switched from Spring Boot 1.3.0M1 to 1.3.0M2. When trying to start the application (either from STS 3.7.0 or via spring-boot:run at the command line) I get the following exception:

java.lang.reflect.InvocationTargetException         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.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:435)         at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationListener : org.springframework.boot.logging.ClasspathLoggingApplicationListener         at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:385)         at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:362)         at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:231)         at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:206)         at org.springframework.boot.SpringApplication.run(SpringApplication.java:971)         at org.springframework.boot.SpringApplication.run(SpringApplication.java:960)         at com.daimler.daivb.services.application.dummyservice.DummyServiceApplication.main(DummyServiceApplication.java:18)         ... 6 more Caused by: java.lang.NoClassDefFoundError: org/springframework/context/event/GenericApplicationListener         at java.lang.ClassLoader.defineClass1(Native Method)         at java.lang.ClassLoader.defineClass(ClassLoader.java:760)         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)         at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)         at java.net.URLClassLoader.access$100(URLClassLoader.java:73)         at java.net.URLClassLoader$1.run(URLClassLoader.java:368)         at java.net.URLClassLoader$1.run(URLClassLoader.java:362)         at java.security.AccessController.doPrivileged(Native Method)         at java.net.URLClassLoader.findClass(URLClassLoader.java:361)         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)         at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)         at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:378)         ... 12 more Caused by: java.lang.ClassNotFoundException: org.springframework.context.event.GenericApplicationListener         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)         ... 25 more 

The mentioned class has been added in spring-context version 4.2.0 but when looking at the dependency tree I can see that Spring Boot 1.3.0M2 still depends on spring-context 4.1.6:

[INFO] com.company.services.application:dummyservice:war:0.0.1-SNAPSHOT [INFO] +- org.springframework.boot:spring-boot-devtools:jar:1.3.0.M2:compile [INFO] |  +- org.springframework.boot:spring-boot:jar:1.3.0.M2:compile [INFO] |  |  \- org.springframework:spring-context:jar:4.1.6.RELEASE:compile [INFO] |  \- org.springframework.boot:spring-boot-autoconfigure:jar:1.3.0.M2:compile [INFO] |     \- org.yaml:snakeyaml:jar:1.15:compile 
like image 956
Michael Rumpf Avatar asked Jul 18 '15 09:07

Michael Rumpf


1 Answers

Spring Boot manages a bunch of dependencies for you and allows you to add them without specifying the version. Spring Boot is obviously based on Spring Framework and uses the latest and greatest so you should avoid at all cost to fix the spring framework version to use yourself.

If you have upgraded to a newer version (to include a bug fix or something) make sure to remove the override before you upgrade Spring Boot as the new version it requires may be incompatible with your override.

If you are using other projects that also provide a dependency management on Spring Framework (such as Spring Cloud) make sure that the dependency management of Spring Boot takes precedence. With Maven, make sure to add the spring-boot-dependencies BOM as the first entry in the <dependenciesManagement> section.

like image 197
Stephane Nicoll Avatar answered Oct 04 '22 10:10

Stephane Nicoll