Spring приложение не запускается за пределами пакета
Я следую этому учебнику для создания базового приложения с 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.spring[email protected]71fa8894: startup date [Wed Jan 18 22:19:12 CET 2017]; root of context hierarchy
Мой вопрос: зачем мне вводить мои классы в пакет? Какое использование имеет? Как я могу избежать этой ошибки? Действительно ли мне нужно использовать пакеты, если это действительно простое приложение?
Ответы
Ответ 1
Поместите ваши java файлы снова в пакет hello
.
Когда класс не включает объявление пакета, он считается в "пакете по умолчанию". Использование "пакета по умолчанию" обычно не рекомендуется, и его следует избегать.
Это может вызвать особые проблемы для Spring загрузочных приложений, которые используют аннотации @ComponentScan
, @EntityScan
или @SpringBootApplication
, так как каждый класс из каждой jar будет прочитан.
Подробнее здесь.
Ответ 2
Я переместил класс, аннотированный с помощью @SpringBootApplication, из пакета по умолчанию в конкретный пакет, и он сработал.
Ответ 3
Я создал пустую папку 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;" Теперь этот весенний загрузочный пакет ищет.
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);
}
}
Тогда все работало нормально.