У меня есть приложение 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);
}
}
Может быть, что-то с циклическими зависимостями Spring bean? Но опять же... Spring должен распознать и это, выйти и дать вам более читаемое сообщение об ошибке.
@Deadpool да, я тоже думаю о круговой зависимости, но из журналов я не могу сказать, что это такое
Это при запуске? Можете ли вы показать соответствующий код, в частности все классы, отмеченные @SpringBootApplication и @Configuration?
@Codo да, это при запуске. Я отредактировал вопрос, чтобы включить основной класс
Удалите аннотации @Configuration и @EnableAutoConfiguration из класса приложения.
@Abhijeet не имеет значения
Вы хорошо используете возможности Spring Boot. Так что есть много вещей, которые могут пойти не так. Можете ли вы опубликовать более полную трассировку стека, которая показывает самую нижнюю часть трассировки стека? Пробовали ли вы отключать некоторые функции Spring Boot до тех пор, пока они не заработают, а затем повторно включать как можно больше, не прерывая запуск, чтобы лучше изолировать проблему?




Нашел проблему. Это произошло из-за изменений классификатора перепаковки 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. Бог знает, что это изменило, но без этого я получил неправильный старт-класс (так же, как ОП), с ним старт-класс был правильным. ¯_(ツ)_/¯
добавление <id>repackage</id> решило мою проблему!!! спасибо @pedorro, ты спас мой день! Я боролся с этим несколько дней
Что касается меня, я добавил 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>
Возникает при переполнении стека из-за слишком глубокой рекурсии приложения.