添加 spring-security-oauth2 后无法实例化接口 org.springframework.context.ApplicationListener
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/47000066/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cannot instantiate interface org.springframework.context.ApplicationListener after adding spring-security-oauth2
提问by displayname
After I added spring-security-oauth2to my pom.xml:
在我添加spring-security-oauth2到我的 pom.xml 之后:
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
I started to get
我开始得到
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)
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).
运行我的@SpringBootApplication. 请注意,我使用的是 Spring Boot 2.0.0.M5,我认为这可能是问题的根源(wrt 版本)。
This is the entire pom.xml I'm using:;
这是我正在使用的整个 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>
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.
我怀疑这可能与版本冲突有关 - stackoverflow 上的大多数答案都是这样 - 但我无法弄清楚我在这里遇到的实际问题。
The release notesfor Spring Boot 2.0.0.M5 state:
Spring Boot 2.0.0.M5的发行说明说明:
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 addorg.springframework.security.oauth:spring-security-oauth2and 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.
来自 Spring Security OAuth 项目的OAuth 2.0 支持功能正在迁移到核心 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,因此旧的应用程序可以继续使用它,直到提供升级路径。
回答by Andy Wilkinson
Having fixed the problems with the example's pom, I can now see the complete stack trace of the failure:
修复了示例 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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:368)
at java.net.URLClassLoader.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
The root cause of the problem is that org.springframework.context.event.GenericApplicationListenerisn't on the classpath. This class is part of the spring-contextmodule and is new in Spring Framework 4.2.
问题的根本原因org.springframework.context.event.GenericApplicationListener是不在类路径上。此类是spring-context模块的一部分,是 Spring Framework 4.2 中的新增内容。
Looking at the pom, you're not using Boot's dependency management (either by importing the spring-boot-dependenciesbom or by using spring-boot-starter-parentas 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-contexttransitively via spring-security-oauth2.
查看 pom,您没有使用 Boot 的依赖项管理(通过导入spring-boot-dependenciesbom 或spring-boot-starter-parent用作项目的父项。这意味着没有管理任何传递依赖项的版本。这导致了这里的问题作为您的项目正在使用 4.0.9.RELEASE 的spring-context传递性 via spring-security-oauth2。
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 Boot 的依赖管理。如果您不想这样做或由于某种未说明的原因不能这样做,则必须手动确保所有可传递依赖项都具有受支持的版本。
回答by Anantha Raju C
回答by Rosberg Linhares
I was having this issue using Gradle+Kotlin. The solution was to set the version of the Spring Boot Gradle Plugin in my library and in my main project to the same value:
我在使用 Gradle+Kotlin 时遇到了这个问题。解决方案是将我的库和主项目中 Spring Boot Gradle 插件的版本设置为相同的值:
plugins {
id("org.springframework.boot") version "2.2.2.RELEASE"
}
回答by HA S
Try to use the following configuration and hope it will solve the problem.
尝试使用以下配置,希望能解决问题。
<?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>
Good Luck ! Salam
祝你好运 !萨拉姆


