web-dev-qa-db-fra.com

Impossible d'instancier l'interface org.springframework.context.ApplicationListener après l'ajout de spring-security-oauth2

Remarque:
Vous pouvez cloner un exemple minimum sur github: https://github.com/silentsnooc/spring-oauth-issue . Il suffit de lancer mahlzeit.api.service.Application en tant qu'application Java.

Après avoir ajouté spring-security-oauth2 à mon pom.xml:

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

J'ai commencé à avoir 

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)

après avoir exécuté mon @SpringBootApplication. Veuillez noter que j'utilise Spring Boot 2.0.0.M5 et je pense que cela pourrait être la cause du problème (versions w.r.t.).

Ceci est le pom.xml entier que j'utilise :;

<?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>

J'ai le soupçon que cela pourrait avoir à voir avec des versions en conflit - la plupart des réponses sur stackoverflow s'avèrent être que - mais je ne peux pas comprendre le problème réel que j'ai ici.


Les notes de version pour Spring Boot 2.0.0.M5 indiquent:

Support OAuth 2.0

La fonctionnalité du projet Spring Security OAuth est en cours de migration vers la version de base de Spring Security. La prise en charge du client OAuth 2.0 a déjà été ajoutée et des fonctionnalités supplémentaires seront migrées ultérieurement.

Si vous dépendez des fonctionnalités Spring Security OAuth qui n'ont pas encore été migrées, vous devrez ajouter org.springframework.security.oauth:spring-security-oauth2 et configurer les éléments manuellement. Si vous avez uniquement besoin du support client OAuth 2.0, vous pouvez utiliser la configuration automatique fournie par Spring Boot 2.0. Nous continuons également à prendre en charge Spring Boot 1.5 afin que les applications plus anciennes puissent continuer à l’utiliser jusqu’à ce qu’un chemin de mise à niveau soit fourni.

4
displayname

Une fois les problèmes résolus avec le pompon de l'exemple, je peux maintenant voir la trace complète de la pile de l'échec:

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

La cause première du problème est que org.springframework.context.event.GenericApplicationListener n'est pas sur le chemin de classe. Cette classe fait partie du module spring-context et est nouvelle dans Spring Framework 4.2.

En regardant le pom, vous n'utilisez pas la gestion des dépendances de Boot (soit en important le spring-boot-dependencies bom, soit en utilisant spring-boot-starter-parent comme parent de votre projet. Cela signifie que les versions de toutes les dépendances transitives ne sont pas gérées. votre projet utilise 4.0.9.RELEASE de spring-context de manière transitoire via spring-security-oauth2.

Je vous recommande fortement d'utiliser la gestion des dépendances de Spring Boot. Si vous ne voulez pas faire cela ou ne pouvez pas le faire pour une raison non déclarée, vous devrez vous assurer manuellement que toutes les dépendances transitives ont des versions prises en charge.

6
Andy Wilkinson

Essayez d’utiliser la configuration suivante et espérez que cela résoudra le problème.

<?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>

Bonne chance ! Salam

0
HA S