【问题标题】:Cannot instantiate interface org.springframework.context.ApplicationListener after adding spring-security-oauth2添加spring-security-oauth2后无法实例化接口org.springframework.context.ApplicationListener
【发布时间】:2018-04-10 12:52:24
【问题描述】:

在我将spring-security-oauth2 添加到我的 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. 版本)。

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

<?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 上的大多数答案都是这样 - 但我无法弄清楚我在这里遇到的实际问题。


release notes 用于 Spring Boot 2.0.0.M5 状态:

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,以便较旧的应用程序可以继续使用它,直到提供升级路径。

【问题讨论】:

  • 你的 spring boot 设置代码在哪里?把它们也放上去。
  • 我的意思是你的autoconfiguration。你的父标签在哪里?请填写完整的pom.xml
  • 我在你的 pom.xml 中没有看到任何包装信息。我的构建插件看起来像 pastebin.com/Ghcd7tWa
  • @AtaurRahmanMunna 好吧,我把它归结为spring-security-oauth2 - 因此我相应地更新了我的问题。似乎添加此依赖项会导致此问题,我不明白为什么。我需要像 TokenStoreJwtAccessTokenConverter 这样的类来确保访问令牌的安全性,但很好.. 它不以该依赖项运行。
  • 不幸的是,该示例不起作用。 pom缺少几个版本,Boot的Maven插件配置不完整。

标签: spring spring-boot spring-security spring-security-oauth2


【解决方案1】:

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

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 中的新增内容。

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

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

【讨论】:

  • 做到了!谢谢 - 我不会想到这一点。
  • 感谢您在 github 问题上更新此链接
【解决方案2】:

尝试使用以下配置,希望能解决问题。

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

祝你好运!萨拉姆

【讨论】:

    【解决方案3】:

    更新 Maven 项目解决了我的问题..

    右击你的Project -> Maven -> Update Project 或快捷方式Alt+F5

    选择Force Update of Snapshots/Releases

    【讨论】:

    • 也为我工作,在提取一些完全与 POM 无关的更改后出现问题。只是Eclipse“完全正常现象”。
    【解决方案4】:

    我在使用 Gradle+Kotlin 时遇到了这个问题。解决方案是将我的库和主项目中的 Spring Boot Gradle 插件的版本设置为相同的值:

    plugins {
        id("org.springframework.boot") version "2.2.2.RELEASE"
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2016-06-21
      • 2020-11-03
      • 2019-01-23
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      相关资源
      最近更新 更多