From 7a25e4edb80aeadcbe6fa8e6a336fbde655112ff Mon Sep 17 00:00:00 2001 From: dreis2211 Date: Wed, 16 Jun 2021 20:07:00 +0200 Subject: [PATCH] Avoid illegal reflective access in CLI tests See gh-26930 --- .../spring-boot-cli/build.gradle | 1 + .../springframework/boot/cli/CliTester.java | 20 +------------------ .../boot/cli/CliTesterSpringApplication.java | 12 ++++++++++- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/spring-boot-project/spring-boot-cli/build.gradle b/spring-boot-project/spring-boot-cli/build.gradle index 8be85e7dde..e2e9cef368 100644 --- a/spring-boot-project/spring-boot-cli/build.gradle +++ b/spring-boot-project/spring-boot-cli/build.gradle @@ -56,6 +56,7 @@ dependencies { loader(project(":spring-boot-project:spring-boot-tools:spring-boot-loader")) + testCompileOnly("org.apache.tomcat.embed:tomcat-embed-core") testImplementation(project(":spring-boot-project:spring-boot")) testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) testImplementation(project(":spring-boot-project:spring-boot-test")) diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java index 980ce55f98..6e28f4dbc5 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTester.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.reflect.Field; import java.net.URI; -import java.net.URL; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; @@ -127,7 +125,6 @@ public class CliTester implements BeforeEachCallback, AfterEachCallback { } private Future submitCommand(T command, String... args) { - clearUrlHandler(); final String[] sources = getSources(args); return Executors.newSingleThreadExecutor().submit(() -> { ClassLoader loader = Thread.currentThread().getContextClassLoader(); @@ -152,21 +149,6 @@ public class CliTester implements BeforeEachCallback, AfterEachCallback { }); } - /** - * The TomcatURLStreamHandlerFactory fails if the factory is already set, use - * reflection to reset it. - */ - private void clearUrlHandler() { - try { - Field field = URL.class.getDeclaredField("factory"); - field.setAccessible(true); - field.set(null, null); - } - catch (Exception ex) { - throw new IllegalStateException(ex); - } - } - protected String[] getSources(String... args) { final String[] sources = new String[args.length]; for (int i = 0; i < args.length; i++) { diff --git a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTesterSpringApplication.java b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTesterSpringApplication.java index 18b600c407..dd4a091a70 100644 --- a/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTesterSpringApplication.java +++ b/spring-boot-project/spring-boot-cli/src/test/java/org/springframework/boot/cli/CliTesterSpringApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,12 @@ package org.springframework.boot.cli; +import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory; + import org.springframework.boot.SpringApplication; import org.springframework.boot.web.context.WebServerPortFileWriter; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.util.ClassUtils; /** * Custom {@link SpringApplication} used by {@link CliTester}. @@ -27,6 +30,13 @@ import org.springframework.context.ConfigurableApplicationContext; */ public class CliTesterSpringApplication extends SpringApplication { + static { + if (ClassUtils.isPresent("org.apache.catalina.webresources.TomcatURLStreamHandlerFactory", + CliTesterSpringApplication.class.getClassLoader())) { + TomcatURLStreamHandlerFactory.disable(); + } + } + public CliTesterSpringApplication(Class... sources) { super(sources); }