线程“主”java.lang.IllegalArgumentException 中的异常:无法实例化接口 org.springframework.context.ApplicationListener

Posted

技术标签:

【中文标题】线程“主”java.lang.IllegalArgumentException 中的异常:无法实例化接口 org.springframework.context.ApplicationListener【英文标题】:Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationListener 【发布时间】:2019-01-23 03:42:49 【问题描述】:

这是我在堆栈上的第一个问题。一开始我想注意到我的英语很糟糕。我正在用 Java 编写程序,它必须读取文件并将内容发送到 localhost:8083/list,但这是模块之一。 我的 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>
        <groupId>org.antek</groupId>
        <artifactId>spring-boot-multi-module</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>List</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我的父 pom.xml 看起来是这样的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         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>org.antek</groupId>
    <artifactId>spring-boot-multi-module</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <modules>
        <module>List</module>
        <module>MainPage</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.yaml</groupId>
                <artifactId>snakeyaml</artifactId>
                <version>1.18</version>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>5.0.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.assertj</groupId>
                <artifactId>assertj-core</artifactId>
                <version>3.10.0</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>4.0.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

我的 Appliaction.java 看起来像这样

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

我的控制器

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class ListController 
    @RequestMapping("/list")
    @ResponseBody
    class Lista 
        MainList list = new MainList();
    

最后是我的程序

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;


public class MainList 
    public static int zwracanie(String[] args) throws IOException 
            String filePath = "C:\\Users\\Antoni\\Desktop\\Lista.txt";
            int number = 0;
            BufferedReader fileReader = null;

            try 
                fileReader = new BufferedReader(new FileReader(filePath));
                String numberAsString = fileReader.readLine();
                number = Integer.parseInt(numberAsString);
             finally 
                if (fileReader != null) 
                    fileReader.close();
                
            
            return number;
        
    

我在 IntelliJ Idea 中工作,当我尝试编译此文件时出现问题

:org.springframework.boot.context.logging.ClasspathLoggingApplicationListener 在 org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:448) 在 org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:427) 在 org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:418) 在 org.springframework.boot.SpringApplication.(SpringApplication.java:268) 在 org.springframework.boot.SpringApplication.(SpringApplication.java:247) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) 在 Application.main(Application.java:8) 引起:java.lang.NoClassDefFoundError: org/springframework/context/event/GenericApplicationListener 在 java.base/java.lang.ClassLoader.defineClass1(本机方法) 在 java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1009) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:801) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:699) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:622) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) 在 org.springframework.util.ClassUtils.forName(ClassUtils.java:274) 在 org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:440) ... 7 更多 引起:java.lang.ClassNotFoundException:org.springframework.context.event.GenericApplicationListener 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) ... 18 更多

【问题讨论】:

欢迎来到 SOF。您能否将项目的依赖关系树添加到问题中? mvn dependency:tree 请注意:堆栈跟踪的重要部分是 Caused by: java.lang.NoClassDefFoundError: org/springframework/context/event/GenericApplicationListener 的行。 Plus:了解编译时错误和运行时异常之间的区别。老实说,这是两个非常不同的东西:不知道区别的人应该花一些时间研究这些基础知识,而不是使用大型复杂框架,例如 spring。 【参考方案1】:

移除依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-framework-bom</artifactId>
</dependency>

您在 4.0.3.RELEASE 版本中添加了它,这会与 Spring Boot 管理的版本产生版本冲突。

【讨论】:

以上是关于线程“主”java.lang.IllegalArgumentException 中的异常:无法实例化接口 org.springframework.context.ApplicationListener的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 的 YML 文件中创建条件属性?

主线程怎么给子线程发送消息

主线程啥都没做,就会等待子线程结束。这是为啥?

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

子线程怎么不阻塞主线程

QT中UI主窗口如何与子线程相互传递参数