Подтвердить что ты не робот

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

Мой вопрос: зачем мне вводить мои классы в пакет? Какое использование имеет? Как я могу избежать этой ошибки? Действительно ли мне нужно использовать пакеты, если это действительно простое приложение?

4b9b3361

Ответ 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);

    }
}

Тогда все работало нормально.