SpringBoot 2 (2.1.6.RELEASE) StackOverFlowError

У меня есть приложение Spring Boot 2, которое запускается и работает, как и ожидалось, при запуске в среде IDE (IntelliJ). Однако, когда я запускаю приложение через командную строку (java -jar app.jar), я получаю исключение StackOverFlowError.

Caused by: java.lang.reflect.InvocationTargetException
    ... 1024 more
Caused by: java.lang.reflect.InvocationTargetException
    ... 1024 more
Caused by: java.lang.reflect.InvocationTargetException
    ... 1024 more
Caused by: java.lang.StackOverflowError
    at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1012)
    at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1535)
    at java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:463)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:404)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

Основной класс выглядит следующим образом

@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@EntityScan(basePackages = "x.y.z")
@EnableJpaRepositories
@EnableTransactionManagement
@EnableAspectJAutoProxy
@EnableScheduling
@EnableAsync
@EnableRetry
@Slf4j
public class Application {

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

}

Возникает при переполнении стека из-за слишком глубокой рекурсии приложения.

Deadpool 18.07.2019 10:28

Может быть, что-то с циклическими зависимостями Spring bean? Но опять же... Spring должен распознать и это, выйти и дать вам более читаемое сообщение об ошибке.

bkis 18.07.2019 10:30

@Deadpool да, я тоже думаю о круговой зависимости, но из журналов я не могу сказать, что это такое

Justice 18.07.2019 10:44

Это при запуске? Можете ли вы показать соответствующий код, в частности все классы, отмеченные @SpringBootApplication и @Configuration?

Codo 18.07.2019 10:48

@Codo да, это при запуске. Я отредактировал вопрос, чтобы включить основной класс

Justice 18.07.2019 10:54

Удалите аннотации @Configuration и @EnableAutoConfiguration из класса приложения.

Abhijeet 18.07.2019 10:55

@Abhijeet не имеет значения

Justice 18.07.2019 11:00

Вы хорошо используете возможности Spring Boot. Так что есть много вещей, которые могут пойти не так. Можете ли вы опубликовать более полную трассировку стека, которая показывает самую нижнюю часть трассировки стека? Пробовали ли вы отключать некоторые функции Spring Boot до тех пор, пока они не заработают, а затем повторно включать как можно больше, не прерывая запуск, чтобы лучше изолировать проблему?

Codo 18.07.2019 12:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
8
2 255
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нашел проблему. Это произошло из-за изменений классификатора перепаковки spring-boot-maven-plugin между версиями 1.5.7 и 2.1.6 (посмотреть здесь).

Мой pom 1.5.7 spring-boot-maven-plugin был настроен следующим образом:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
    <goals>
      <goal>build-info</goal>
      <goal>repackage</goal>
    </goals>
    <configuration>
      <classifier>exec</classifier>
      <additionalProperties>
        <build.number>${buildNumber}</build.number>
      </additionalProperties>
    </configuration>
  </execution>
 </executions>
</plugin>

Полученный манифест из сборки после обновления до релиза spring-boot-maven-plugin:2.2.16 не имеет правильного Start-Class.

Manifest-Version: 1.0
Implementation-Title: my-app
Implementation-Version: 2.1.0-SNAPSHOT
Start-Class: org.springframework.boot.loader.JarLauncher
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

Изменение spring-boot-maven-plugin:2.2.16 на следующее устранило проблему - теперь банка MANIFEST содержит правильный Start-Class.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>repackage</id>
            <goals>
                <goal>build-info</goal>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <classifier>exec</classifier>
                <additionalProperties>
                    <build.number>${buildNumber}</build.number>
                </additionalProperties>
            </configuration>
        </execution>
    </executions>
</plugin>

Правильно MANIFEST:

Manifest-Version: 1.0
Implementation-Title: my-app
Implementation-Version: 2.1.0-SNAPSHOT
Start-Class: my.app.MainClass
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

Теперь приложение запускается нормально.

Я обнаружил эту же проблему в совершенно новом проекте Spring Boot с использованием версии 2.2.1.RELEASE. Для меня решением было просто добавить <id>repackage</id> к плагину maven. Бог знает, что это изменило, но без этого я получил неправильный старт-класс (так же, как ОП), с ним старт-класс был правильным. ¯_(ツ)_/¯

pedorro 16.11.2019 00:11

добавление <id>repackage</id> решило мою проблему!!! спасибо @pedorro, ты спас мой день! Я боролся с этим несколько дней

Ivy 10.05.2021 20:06

Что касается меня, я добавил mainClass в плагин весенней загрузки maven, и файл MANIFEST был сгенерирован правильно.

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <mainClass>com.test.App</mainClass>
                <finalName>JarName</finalName>
        </configuration>
    </execution>
</executions>

Другие вопросы по теме