|
16 | 16 |
|
17 | 17 | package org.springframework.boot;
|
18 | 18 |
|
| 19 | +import java.lang.StackWalker.StackFrame; |
19 | 20 | import java.time.Duration;
|
20 | 21 | import java.util.ArrayList;
|
21 | 22 | import java.util.Arrays;
|
|
25 | 26 | import java.util.LinkedHashSet;
|
26 | 27 | import java.util.List;
|
27 | 28 | import java.util.Map;
|
| 29 | +import java.util.Objects; |
| 30 | +import java.util.Optional; |
28 | 31 | import java.util.Properties;
|
29 | 32 | import java.util.Set;
|
30 | 33 | import java.util.stream.Collectors;
|
| 34 | +import java.util.stream.Stream; |
31 | 35 |
|
32 | 36 | import org.apache.commons.logging.Log;
|
33 | 37 | import org.apache.commons.logging.LogFactory;
|
@@ -274,18 +278,13 @@ public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySourc
|
274 | 278 | }
|
275 | 279 |
|
276 | 280 | private Class<?> deduceMainApplicationClass() {
|
277 |
| - try { |
278 |
| - StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); |
279 |
| - for (StackTraceElement stackTraceElement : stackTrace) { |
280 |
| - if ("main".equals(stackTraceElement.getMethodName())) { |
281 |
| - return Class.forName(stackTraceElement.getClassName()); |
282 |
| - } |
283 |
| - } |
284 |
| - } |
285 |
| - catch (ClassNotFoundException ex) { |
286 |
| - // Swallow and continue |
287 |
| - } |
288 |
| - return null; |
| 281 | + return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(this::findMainClass) |
| 282 | + .orElse(null); |
| 283 | + } |
| 284 | + |
| 285 | + private Optional<Class<?>> findMainClass(Stream<StackFrame> stack) { |
| 286 | + return stack.filter((frame) -> Objects.equals(frame.getMethodName(), "main")).findFirst() |
| 287 | + .map(StackWalker.StackFrame::getDeclaringClass); |
289 | 288 | }
|
290 | 289 |
|
291 | 290 | /**
|
|
0 commit comments