Hinweis:
Sie können ein Mindestbeispiel auf github klonen: https://github.com/silentsnooc/spring-oauth-issue . Führen Sie einfachmahlzeit.api.service.Application
als Java-Anwendung aus.
Nachdem ich spring-security-oauth2
zu meiner pom.xml hinzugefügt habe:
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
Ich fing an zu bekommen
Exception in thread "main" Java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationListener : org.springframework.boot.context.logging.ClasspathLoggingApplicationListener
at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.Java:439)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.Java:418)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.Java:409)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.Java:268)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.Java:247)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1245)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1233)
nachdem ich meinen @SpringBootApplication
ausgeführt habe. Bitte beachten Sie, dass ich Spring Boot 2.0.0.M5 verwende und ich denke, dass dies die Ursache des Problems sein kann (zB Versionen).
Dies ist die gesamte pom.xml, die ich verwende :;
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>server</artifactId>
<groupId>mahlzeit</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>api</artifactId>
<properties>
<spring.boot.version>2.0.0.M5</spring.boot.version>
</properties>
<dependencies>
<!-- Spring Framework Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1208-jdbc42-atlassian-hosted</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<!-- Required since this is currently using Spring RC version -->
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
Ich habe den Verdacht, dass dies mit widersprüchlichen Versionen zu tun haben könnte - die meisten Antworten auf stackoverflow sind genau das -, aber ich kann nicht herausfinden, was ich hier wirklich habe.
Die Versionshinweise für Spring Boot 2.0.0.M5:
OAuth 2.0-Unterstützung
Die Funktionalität des Spring Security OAuth-Projekts wird auf die Spring-Kernsicherheitsumgebung migriert. Die Unterstützung für OAuth 2.0-Clients wurde bereits hinzugefügt, und zusätzliche Funktionen werden zu gegebener Zeit migriert.
Wenn Sie sich auf Spring Security OAuth-Funktionen verlassen, die noch nicht migriert wurden, müssen Sieorg.springframework.security.oauth:spring-security-oauth2
hinzufügen und die Einstellungen manuell konfigurieren. Wenn Sie nur die Unterstützung für OAuth 2.0-Clients benötigen, können Sie die von Spring Boot 2.0 bereitgestellte automatische Konfiguration verwenden. Wir unterstützen auch weiterhin Spring Boot 1.5, so dass ältere Anwendungen dies weiterhin verwenden können, bis ein Aktualisierungspfad angegeben wird.
Nachdem wir die Probleme mit dem Pom des Beispiels behoben haben, kann ich jetzt die vollständige Stapelverfolgung des Fehlers sehen:
Exception in thread "main" Java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationListener : org.springframework.boot.context.logging.ClasspathLoggingApplicationListener
at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.Java:439)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.Java:418)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.Java:409)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.Java:268)
at org.springframework.boot.SpringApplication.<init>(SpringApplication.Java:247)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1245)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1233)
at mahlzeit.api.Application.main(Application.Java:14)
Caused by: Java.lang.NoClassDefFoundError: org/springframework/context/event/GenericApplicationListener
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:763)
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 Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:331)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
at org.springframework.util.ClassUtils.forName(ClassUtils.Java:255)
at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.Java:431)
... 7 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 Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:331)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
... 21 more
Die Hauptursache des Problems ist, dass sich org.springframework.context.event.GenericApplicationListener
nicht im Klassenpfad befindet. Diese Klasse ist Teil des spring-context
-Moduls und neu in Spring Framework 4.2.
Wenn Sie sich das Pom anschauen, verwenden Sie nicht die Abhängigkeitsverwaltung von Boot (entweder durch Importieren von spring-boot-dependencies
bom oder durch Verwendung von spring-boot-starter-parent
als übergeordnetes Projekt. Dies bedeutet, dass die Versionen von transitiven Abhängigkeiten nicht verwaltet werden Ihr Projekt verwendet 4.0.9.RELEASE von spring-context
transitiv über spring-security-oauth2
.
Ich würde dringend empfehlen, dass Sie das Abhängigkeitsmanagement von Spring Boot verwenden. Wenn Sie dies nicht tun möchten oder dies aus einem nicht genannten Grund nicht tun können, müssen Sie manuell sicherstellen, dass alle transitiven Abhängigkeiten Versionen unterstützen.
Versuchen Sie, die folgende Konfiguration zu verwenden, und hoffen Sie, dass das Problem dadurch gelöst wird.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0
http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>YOUR GROUP ID</groupId>
<artifactId>ART ID</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>YOUR PROJECT NAME</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<Java.version>1.8</Java.version>
</properties>
....
[YOUR REST OF CONFIGURATIONS]
....
</project>
Viel Glück ! Salam