我正在按照本教程使用 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
我的问题是,为什么我需要将我的类放入一个包中?它有什么用?如何避免此错误?如果它是一个非常简单的应用程序,我真的需要使用包吗?
再次将 Java 文件放入hello
包中。
当类不包含包声明时,它被视为在"默认包"中。通常不鼓励使用"默认包",应避免使用。
对于使用@ComponentScan
、@EntityScan
或@SpringBootApplication
注释的 Spring Boot 应用程序来说,它可能会导致特殊问题,因为每个 jar 中的每个类都会被读取。
在此处阅读更多内容。
我将带有@SpringBootApplication注释的类从默认包移动到特定包,它起作用了。
我创建了一个空白的Maven文件夹,其中Java文件夹是最后一个。我添加了类主应用程序。
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 类移动到其中。注意"包测试;"现在这个默认包 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);
}
}
然后它工作正常。