Spring应用程序不会在包之外启动

时间:2017-01-18 21:24:36

标签: java spring

我正在关注this教程,用Spring构建一个基本的应用程序。只要我遵循这个子目录结构,它就能完美运行:

└── src
    └── main
        └── java
            └── hello

如果我将我的Application.javaScheduledTasks.java类移出hello包,我会收到以下错误:

** WARNING ** : Your ApplicationContext is unlikely to start due to a `@ComponentScan` of the default package.

几秒钟后,确实......

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.context.annotation.AnnotationConfigApplicationContext@71fa8894: startup date [Wed Jan 18 22:19:12 CET 2017]; root of context hierarchy

我的问题是,为什么我需要将我的课程放入包中?它有什么用?我怎样才能避免这个错误?如果它是一个非常简单的应用程序,我真的需要使用它吗?

3 个答案:

答案 0 :(得分:72)

将您的java文件重新放入hello包。

当一个类不包含包声明时,它被认为是在“default package”中。通常不鼓励使用“默认包”,应该避免使用。

对于使用@ComponentScan@EntityScan@SpringBootApplication注释的Spring Boot应用程序,它可能会导致特定问题,因为 每个jar中的每个类 < / strong>,将被阅读。

了解更多here

答案 1 :(得分:12)

我将使用@SpringBootApplication注释的类从默认包移到特定的包中,并且它有效。

答案 2 :(得分:0)

我创建了一个空白的Maven文件夹,其中Java文件夹是最后一个文件夹。我添加了MainApplication类。

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


@SpringBootApplication
public class MainApplication {

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

    }
}

此外,我必须在Java文件夹(例如com.test)中创建一个程序包,然后将MainApplication类移入其中。注意“包com.test;”现在,该默认软件包Spring Boot正在寻找。

package com.test;

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

@SpringBootApplication
public class MainApplication {

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

    }
}

然后工作正常。