Skip to content

Commit 38fedcf

Browse files
committed
Polish "Use StackWalker to deduce main application class"
See gh-31701
1 parent ea3fe95 commit 38fedcf

File tree

2 files changed

+9
-33
lines changed

2 files changed

+9
-33
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot;
1818

19+
import java.lang.StackWalker.StackFrame;
1920
import java.time.Duration;
2021
import java.util.ArrayList;
2122
import java.util.Arrays;
@@ -26,9 +27,11 @@
2627
import java.util.List;
2728
import java.util.Map;
2829
import java.util.Objects;
30+
import java.util.Optional;
2931
import java.util.Properties;
3032
import java.util.Set;
3133
import java.util.stream.Collectors;
34+
import java.util.stream.Stream;
3235

3336
import org.apache.commons.logging.Log;
3437
import org.apache.commons.logging.LogFactory;
@@ -275,12 +278,15 @@ public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySourc
275278
}
276279

277280
private Class<?> deduceMainApplicationClass() {
278-
return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
279-
.walk((s) -> s.filter(e -> Objects.equals(e.getMethodName(), "main")).findFirst()
280-
.map(StackWalker.StackFrame::getDeclaringClass))
281+
return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(this::findMainClass)
281282
.orElse(null);
282283
}
283284

285+
private Optional<Class<?>> findMainClass(Stream<StackFrame> stack) {
286+
return stack.filter((frame) -> Objects.equals(frame.getMethodName(), "main")).findFirst()
287+
.map(StackWalker.StackFrame::getDeclaringClass);
288+
}
289+
284290
/**
285291
* Run the Spring application, creating and refreshing a new
286292
* {@link ApplicationContext}.

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.LinkedHashSet;
2424
import java.util.List;
2525
import java.util.Map;
26-
import java.util.Objects;
2726
import java.util.Set;
2827
import java.util.concurrent.atomic.AtomicInteger;
2928
import java.util.concurrent.atomic.AtomicReference;
@@ -1315,35 +1314,6 @@ void shouldRegisterHints() {
13151314
.accepts(hints);
13161315
}
13171316

1318-
@Test
1319-
void deduceMainApplicationClass() {
1320-
assertThat(
1321-
Objects.equals(deduceMainApplicationClassByStackWalker(), deduceMainApplicationClassByThrowException()))
1322-
.isTrue();
1323-
}
1324-
1325-
private Class<?> deduceMainApplicationClassByThrowException() {
1326-
try {
1327-
StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
1328-
for (StackTraceElement stackTraceElement : stackTrace) {
1329-
if ("main".equals(stackTraceElement.getMethodName())) {
1330-
return Class.forName(stackTraceElement.getClassName());
1331-
}
1332-
}
1333-
}
1334-
catch (ClassNotFoundException ex) {
1335-
// Swallow and continue
1336-
}
1337-
return null;
1338-
}
1339-
1340-
private Class<?> deduceMainApplicationClassByStackWalker() {
1341-
return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
1342-
.walk((s) -> s.filter(e -> Objects.equals(e.getMethodName(), "main")).findFirst()
1343-
.map(StackWalker.StackFrame::getDeclaringClass))
1344-
.orElse(null);
1345-
}
1346-
13471317
private <S extends AvailabilityState> ArgumentMatcher<ApplicationEvent> isAvailabilityChangeEventWithState(
13481318
S state) {
13491319
return (argument) -> (argument instanceof AvailabilityChangeEvent<?>)

0 commit comments

Comments
 (0)