我正在关注this教程,用Spring构建一个基本的应用程序。只要我遵循这个子目录结构,它就能完美运行:
└── src
└── main
└── java
└── hello
如果我将我的Application.java
和ScheduledTasks.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
我的问题是,为什么我需要将我的课程放入包中?它有什么用?我怎样才能避免这个错误?如果它是一个非常简单的应用程序,我真的需要使用它吗?
答案 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);
}
}
然后工作正常。