添加spring-security-oauth2后无法实例化接口org.springframework.context.ApplicationListener

时间:2017-10-29 12:15:40

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

我将<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.2.0.RELEASE</version> </dependency> 添加到我的pom.xml后:

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

。请注意我使用的是Spring Boot 2.0.0.M5,我认为这可能是问题的根源(w.r.t.版本)。

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

org.springframework.security.oauth:spring-security-oauth2

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

Spring Boot 2.0.0.M5状态的release notes

  

OAuth 2.0支持

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

  如果您依赖尚未迁移的Spring Security OAuth功能,则需要添加int i = 0; int q = 0; scanf("%d %d", &i, &q); 并手动配置。如果您只需要OAuth 2.0客户端支持,则可以使用Spring Boot 2.0提供的自动配置。我们还继续支持Spring Boot 1.5,因此旧的应用程序可以继续使用它,直到提供升级路径。

4 个答案:

答案 0 :(得分:7)

修复了示例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过渡使用spring-security-oauth2的4.0.9.RELEASE,因此导致此问题。

我强烈建议您使用Spring Boot的依赖关系管理。如果您不想这样做或因某些未说明的原因而无法执行此操作,则必须手动确保所有传递依赖项都具有受支持的版本。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

<?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 :(得分:0)

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

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

选择Force Update of Snapshots/Releases

enter image description here