添加 spring-security-oauth2 后无法实例化接口 org.springframework.context.ApplicationListener [英] Cannot instantiate interface org.springframework.context.ApplicationListener after adding spring-security-oauth2

查看:34
本文介绍了添加 spring-security-oauth2 后无法实例化接口 org.springframework.context.ApplicationListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我将 spring-security-oauth2 添加到我的 pom.xml 之后:

After I added spring-security-oauth2 to my pom.xml:

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

我开始了

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)

在运行我的 @SpringBootApplication 之后.请注意,我使用的是 Spring Boot 2.0.0.M5,我认为这可能是问题的根源(w.r.t. 版本).

after running my @SpringBootApplication. Please note that I am using Spring Boot 2.0.0.M5 and I think that this might be the root of the problem (w.r.t. versions).

这是我使用的整个 pom.xml:;

This is the entire pom.xml I'm using:;

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

我怀疑这可能与版本冲突有关 - stackoverflow 上的大多数答案都是这样 - 但我无法弄清楚我在这里遇到的实际问题.

I have the suspicion this might have to do with conflicting versions - most answers on stackoverflow turn out to be just that - but I cannot make out the actual issue I am having here.

发行说明 对于 Spring Boot 2.0.0.M5 状态:

The release notes for Spring Boot 2.0.0.M5 state:

OAuth 2.0 支持

Spring Security OAuth 项目的功能正在迁移到核心 Spring Security.已添加 OAuth 2.0 客户端支持,并将在适当时候迁移其他功能.

如果您依赖尚未迁移的 Spring Security OAuth 功能,则需要添加 org.springframework.security.oauth:spring-security-oauth2 并手动配置.如果您只需要 OAuth 2.0 客户端支持,您可以使用 Spring Boot 2.0 提供的自动配置.我们还将继续支持 Spring Boot 1.5,以便旧的应用程序可以继续使用它,直到提供升级路径.

OAuth 2.0 Support

Functionality from the Spring Security OAuth project is being migrated to core Spring Security. OAuth 2.0 client support has already been added and additional features will be migrated in due course.

If you depend on Spring Security OAuth features that have not yet been migrated you will need to add org.springframework.security.oauth:spring-security-oauth2 and configure things manually. If you only need OAuth 2.0 client support you can use the auto-configuration provided by Spring Boot 2.0. We’re also continuing to support Spring Boot 1.5 so older applications can continue to use that until an upgrade path is provided.

推荐答案

解决了示例的 pom 问题后,我现在可以看到失败的完整堆栈跟踪:

Having fixed the problems with the example's pom, I can now see the complete stack trace of the failure:

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

问题的根本原因是 org.springframework.context.event.GenericApplicationListener 不在类路径上.此类是 spring-context 模块的一部分,是 Spring Framework 4.2 中的新增内容.

The root cause of the problem is that org.springframework.context.event.GenericApplicationListener isn't on the classpath. This class is part of the spring-context module and is new in Spring Framework 4.2.

查看 pom,您没有使用 Boot 的依赖项管理(通过导入 spring-boot-dependencies bom 或使用 spring-boot-starter-parent> 作为您项目的父级.这意味着没有管理任何传递依赖项的版本.这导致了这里的问题,因为您的项目通过 spring-context 传递使用 4.0.9.RELEASE代码>spring-security-oauth2.

Looking at the pom, you're not using Boot's dependency management (either by importing the spring-boot-dependencies bom or by using spring-boot-starter-parent as your project's parent. This means that the versions of any transitive dependencies aren't being managed. That's causing the problem here as your project is using 4.0.9.RELEASE of spring-context transitively via spring-security-oauth2.

我强烈建议你使用 Spring Boot 的依赖管理.如果您不想这样做或由于某种未说明的原因不能这样做,则必须手动确保所有可传递依赖项都具有受支持的版本.

I would strongly recommend that you use Spring Boot's dependency management. If you don't want to do that or can't do that for some unstated reason, you will have to manually ensure that all transitive dependencies have supported versions.

这篇关于添加 spring-security-oauth2 后无法实例化接口 org.springframework.context.ApplicationListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆