diff --git a/spring-boot-docs/src/main/asciidoc/getting-started.adoc b/spring-boot-docs/src/main/asciidoc/getting-started.adoc index fb7b3822f6..43874e6045 100644 --- a/spring-boot-docs/src/main/asciidoc/getting-started.adoc +++ b/spring-boot-docs/src/main/asciidoc/getting-started.adoc @@ -50,14 +50,10 @@ The following embedded servlet containers are supported out of the box: |=== |Name |Servlet Version |Java Version -|Tomcat 8 +|Tomcat 8.5 |3.1 |Java 7+ -|Tomcat 7 -|3.0 -|Java 6+ - |Jetty 9.3 |3.1 |Java 8+ diff --git a/spring-boot-docs/src/main/asciidoc/howto.adoc b/spring-boot-docs/src/main/asciidoc/howto.adoc index 59f9e56bc7..5c52110a02 100644 --- a/spring-boot-docs/src/main/asciidoc/howto.adoc +++ b/spring-boot-docs/src/main/asciidoc/howto.adoc @@ -930,57 +930,6 @@ add a listener to the `Builder`: -[[howto-use-tomcat-7]] -=== Use Tomcat 7.x or 8.0 -Tomcat 7 & 8.0 work with Spring Boot, but the default is to use Tomcat 8.5. If you cannot -use Tomcat 8.5 (for example, because you are using Java 1.6) you will need to change your -classpath to reference a different version. - - - -[[howto-use-tomcat-7-maven]] -==== Use Tomcat 7.x or 8.0 with Maven -If you are using the starters and parent you can change the Tomcat version property -and additionally import `tomcat-juli`. E.g. for a simple webapp or service: - -[source,xml,indent=0,subs="verbatim,quotes,attributes"] ----- - - 7.0.59 - - - ... - - org.springframework.boot - spring-boot-starter-web - - - org.apache.tomcat - tomcat-juli - ${tomcat.version} - - ... - ----- - - - -==== Use Tomcat 7.x or 8.0 with Gradle -[[howto-use-tomcat-7-gradle]] -With Gradle, you can change the Tomcat version by setting the `tomcat.version` property -and then additionally include `tomcat-juli`: - -[source,groovy,indent=0,subs="verbatim,quotes,attributes"] ----- - ext['tomcat.version'] = '7.0.59' - dependencies { - compile 'org.springframework.boot:spring-boot-starter-web' - compile group:'org.apache.tomcat', name:'tomcat-juli', version:property('tomcat.version') - } ----- - - - [[howto-use-jetty-9.2]] === Use Jetty 9.2 Jetty 9.2 works with Spring Boot, but the default is to use Jetty 9.3. If you cannot use diff --git a/spring-boot-samples/README.adoc b/spring-boot-samples/README.adoc index a441fd8b8d..fbc9704a6b 100644 --- a/spring-boot-samples/README.adoc +++ b/spring-boot-samples/README.adoc @@ -207,12 +207,6 @@ The following sample applications are provided: | link:spring-boot-sample-tomcat-ssl[spring-boot-sample-tomcat-ssl] | Web application that uses Tomcat configured with SSL -| link:spring-boot-sample-tomcat7-jsp[spring-boot-sample-tomcat7-jsp] -| Web application that uses JSP templates with Tomcat 7 - -| link:spring-boot-sample-tomcat7-ssl[spring-boot-sample-tomcat7-ssl] -| Web application that uses Tomcat 7 configured with SSL - | link:spring-boot-sample-tomcat80-ssl[spring-boot-sample-tomcat80-ssl] | Web application that uses Tomcat 8.0 configured with SSL diff --git a/spring-boot-samples/pom.xml b/spring-boot-samples/pom.xml index e7104b3362..478991b99f 100644 --- a/spring-boot-samples/pom.xml +++ b/spring-boot-samples/pom.xml @@ -89,8 +89,6 @@ spring-boot-sample-tomcat-jsp spring-boot-sample-tomcat-ssl spring-boot-sample-tomcat-multi-connectors - spring-boot-sample-tomcat7-jsp - spring-boot-sample-tomcat7-ssl spring-boot-sample-tomcat80-ssl spring-boot-sample-traditional spring-boot-sample-undertow diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/pom.xml b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/pom.xml deleted file mode 100644 index 706f544eb2..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-samples - 2.0.0.BUILD-SNAPSHOT - - spring-boot-sample-tomcat7-jsp - war - Spring Boot Tomcat 7 JSP Sample - Spring Boot Tomcat 7 JSP Sample - http://projects.spring.io/spring-boot/ - - Pivotal Software, Inc. - http://www.spring.io - - - ${basedir}/../.. - / - 7.0.59 - - - - - org.springframework.boot - spring-boot-starter-web - - - javax.servlet - jstl - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.apache.tomcat - tomcat-juli - ${tomcat.version} - provided - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - - diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/java/sample/tomcat7/jsp/SampleTomcat7JspApplication.java b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/java/sample/tomcat7/jsp/SampleTomcat7JspApplication.java deleted file mode 100644 index bb13733f99..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/java/sample/tomcat7/jsp/SampleTomcat7JspApplication.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package sample.tomcat7.jsp; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.support.SpringBootServletInitializer; - -@SpringBootApplication -public class SampleTomcat7JspApplication extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(SampleTomcat7JspApplication.class); - } - - public static void main(String[] args) throws Exception { - SpringApplication.run(SampleTomcat7JspApplication.class, args); - } - -} diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/java/sample/tomcat7/jsp/WelcomeController.java b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/java/sample/tomcat7/jsp/WelcomeController.java deleted file mode 100644 index 7f32d43556..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/java/sample/tomcat7/jsp/WelcomeController.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package sample.tomcat7.jsp; - -import java.util.Date; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -@Controller -public class WelcomeController { - - @Value("${application.message:Hello World}") - private String message = "Hello World"; - - @GetMapping("/") - public String welcome(Map model) { - model.put("time", new Date()); - model.put("message", this.message); - return "welcome"; - } - -} diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/resources/application.properties deleted file mode 100644 index 2af7f6e200..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -spring.mvc.view.prefix: /WEB-INF/jsp/ -spring.mvc.view.suffix: .jsp -application.message: Hello Phil \ No newline at end of file diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/webapp/WEB-INF/jsp/welcome.jsp b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/webapp/WEB-INF/jsp/welcome.jsp deleted file mode 100644 index 3196dac625..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/main/webapp/WEB-INF/jsp/welcome.jsp +++ /dev/null @@ -1,18 +0,0 @@ - - -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> - - - - - - - Spring URL: ${springUrl} at ${time} -
- JSTL URL: ${url} -
- Message: ${message} - - - diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/test/java/sample/tomcat7/jsp/SampleWebJspApplicationTests.java b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/test/java/sample/tomcat7/jsp/SampleWebJspApplicationTests.java deleted file mode 100644 index a112afcde7..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/src/test/java/sample/tomcat7/jsp/SampleWebJspApplicationTests.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package sample.tomcat7.jsp; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Basic integration tests for JSP application. - * - * @author Phillip Webb - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -@DirtiesContext -public class SampleWebJspApplicationTests { - - @Autowired - private TestRestTemplate restTemplate; - - @Test - public void testJspWithEl() throws Exception { - ResponseEntity entity = this.restTemplate.getForEntity("/", String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).contains("/resources/text.txt"); - } - -} diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/pom.xml b/spring-boot-samples/spring-boot-sample-tomcat7-ssl/pom.xml deleted file mode 100644 index ae2d300fe7..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-samples - 2.0.0.BUILD-SNAPSHOT - - spring-boot-sample-tomcat7-ssl - Spring Boot Tomcat 7 SSL Sample - Spring Boot Tomcat 7 SSL Sample - http://projects.spring.io/spring-boot/ - - Pivotal Software, Inc. - http://www.spring.io - - - ${basedir}/../.. - 7.0.69 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework - spring-webmvc - - - org.apache.httpcomponents - httpclient - - - org.apache.tomcat - tomcat-juli - ${tomcat.version} - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/java/sample/tomcat/ssl/SampleTomcatSslApplication.java b/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/java/sample/tomcat/ssl/SampleTomcatSslApplication.java deleted file mode 100644 index c801ea33d0..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/java/sample/tomcat/ssl/SampleTomcatSslApplication.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package sample.tomcat.ssl; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SampleTomcatSslApplication { - - public static void main(String[] args) throws Exception { - SpringApplication.run(SampleTomcatSslApplication.class, args); - } - -} diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/java/sample/tomcat/ssl/web/SampleController.java b/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/java/sample/tomcat/ssl/web/SampleController.java deleted file mode 100644 index 7ca0d5ed01..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/java/sample/tomcat/ssl/web/SampleController.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package sample.tomcat.ssl.web; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -public class SampleController { - - @GetMapping("/") - @ResponseBody - public String helloWorld() { - return "Hello, world"; - } - -} diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/resources/application.properties deleted file mode 100644 index 37199bfd25..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -server.port = 8443 -server.ssl.key-store = classpath:sample.jks -server.ssl.key-store-password = secret -server.ssl.key-password = password diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/resources/sample.jks b/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/resources/sample.jks deleted file mode 100644 index 6aa9a28053..0000000000 Binary files a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/main/resources/sample.jks and /dev/null differ diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/test/java/sample/tomcat/ssl/SampleTomcatSslApplicationTests.java b/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/test/java/sample/tomcat/ssl/SampleTomcatSslApplicationTests.java deleted file mode 100644 index 81856affbb..0000000000 --- a/spring-boot-samples/spring-boot-sample-tomcat7-ssl/src/test/java/sample/tomcat/ssl/SampleTomcatSslApplicationTests.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package sample.tomcat.ssl; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -@DirtiesContext -public class SampleTomcatSslApplicationTests { - - @Autowired - private TestRestTemplate restTemplate; - - @Test - public void testHome() throws Exception { - ResponseEntity entity = this.restTemplate.getForEntity("/", String.class); - assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(entity.getBody()).isEqualTo("Hello, world"); - } - -} diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/SkipPatternJarScanner.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/SkipPatternJarScanner.java index 6e3343e508..6b555df41d 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/SkipPatternJarScanner.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/SkipPatternJarScanner.java @@ -23,7 +23,6 @@ import org.apache.tomcat.util.scan.StandardJarScanFilter; import org.apache.tomcat.util.scan.StandardJarScanner; import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; /** @@ -37,24 +36,15 @@ import org.springframework.util.StringUtils; */ class SkipPatternJarScanner extends StandardJarScanner { - private static final String JAR_SCAN_FILTER_CLASS = "org.apache.tomcat.JarScanFilter"; - private final JarScanner jarScanner; - private final Set patterns; - SkipPatternJarScanner(JarScanner jarScanner, Set patterns) { Assert.notNull(jarScanner, "JarScanner must not be null"); Assert.notNull(jarScanner, "Patterns must not be null"); this.jarScanner = jarScanner; - this.patterns = patterns; - setPatternToTomcat8SkipFilter(); - } - - private void setPatternToTomcat8SkipFilter() { - if (ClassUtils.isPresent(JAR_SCAN_FILTER_CLASS, null)) { - new Tomcat8TldSkipSetter(this).setSkipPattern(this.patterns); - } + StandardJarScanFilter filter = new StandardJarScanFilter(); + filter.setTldSkip(StringUtils.collectionToCommaDelimitedString(patterns)); + this.jarScanner.setJarScanFilter(filter); } /** @@ -68,23 +58,4 @@ class SkipPatternJarScanner extends StandardJarScanner { context.setJarScanner(scanner); } - /** - * Tomcat 8 specific logic to setup the scanner. - */ - private static class Tomcat8TldSkipSetter { - - private final StandardJarScanner jarScanner; - - Tomcat8TldSkipSetter(StandardJarScanner jarScanner) { - this.jarScanner = jarScanner; - } - - public void setSkipPattern(Set patterns) { - StandardJarScanFilter filter = new StandardJarScanFilter(); - filter.setTldSkip(StringUtils.collectionToCommaDelimitedString(patterns)); - this.jarScanner.setJarScanFilter(filter); - } - - } - } diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java index ac82e37b27..93fe10e467 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainer.java @@ -100,7 +100,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer Context context = findContext(); try { - ContextBindings.bindClassLoader(context, getNamingToken(context), + ContextBindings.bindClassLoader(context, context.getNamingToken(), getClass().getClassLoader()); } catch (NamingException ex) { @@ -194,7 +194,7 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer } finally { Context context = findContext(); - ContextBindings.unbindClassLoader(context, getNamingToken(context), + ContextBindings.unbindClassLoader(context, context.getNamingToken(), getClass().getClassLoader()); } } @@ -317,15 +317,4 @@ public class TomcatEmbeddedServletContainer implements EmbeddedServletContainer return this.tomcat; } - private Object getNamingToken(Context context) { - try { - return context.getNamingToken(); - } - catch (NoSuchMethodError ex) { - // Use the context itself on Tomcat 7 - return context; - } - - } - } diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatResources.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatResources.java deleted file mode 100644 index 57372769db..0000000000 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatResources.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2012-2016 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.context.embedded.tomcat; - -import java.io.File; -import java.net.URL; -import java.net.URLClassLoader; - -import org.apache.catalina.Context; -import org.apache.catalina.WebResourceRoot.ResourceSetType; - -/** - * Abstraction to add resources that works with Tomcat 8. - * - * @author Dave Syer - * @author Phillip Webb - */ -abstract class TomcatResources { - - private final Context context; - - TomcatResources(Context context) { - this.context = context; - } - - /** - * Add resources from the classpath. - */ - public void addClasspathResources() { - ClassLoader loader = getClass().getClassLoader(); - if (loader instanceof URLClassLoader) { - for (URL url : ((URLClassLoader) loader).getURLs()) { - String file = url.getFile(); - if (file.endsWith(".jar") || file.endsWith(".jar!/")) { - String jar = url.toString(); - if (!jar.startsWith("jar:")) { - // A jar file in the file system. Convert to Jar URL. - jar = "jar:" + jar + "!/"; - } - addJar(jar); - } - else if (url.toString().startsWith("file:")) { - String dir = url.toString().substring("file:".length()); - if (new File(dir).isDirectory()) { - addDir(dir, url); - } - } - } - } - } - - protected final Context getContext() { - return this.context; - } - - /** - * Called to add a JAR to the resources. - * @param jar the URL spec for the jar - */ - protected abstract void addJar(String jar); - - /** - * Called to add a dir to the resource. - * @param dir the dir - * @param url the URL - */ - protected abstract void addDir(String dir, URL url); - - /** - * Return a {@link TomcatResources} instance for the currently running Tomcat version. - * @param context the tomcat context - * @return a {@link TomcatResources} instance. - */ - public static TomcatResources get(Context context) { - return new Tomcat8Resources(context); - } - - /** - * {@link TomcatResources} for Tomcat 8. - */ - static class Tomcat8Resources extends TomcatResources { - - Tomcat8Resources(Context context) { - super(context); - } - - @Override - protected void addJar(String jar) { - addResourceSet(jar); - } - - @Override - protected void addDir(String dir, URL url) { - addResourceSet(url.toString()); - } - - private void addResourceSet(String resource) { - try { - if (isInsideNestedJar(resource)) { - // It's a nested jar but we now don't want the suffix because Tomcat - // is going to try and locate it as a root URL (not the resource - // inside it) - resource = resource.substring(0, resource.length() - 2); - } - URL url = new URL(resource); - String path = "/META-INF/resources"; - getContext().getResources().createWebResourceSet( - ResourceSetType.RESOURCE_JAR, "/", url, path); - } - catch (Exception ex) { - // Ignore (probably not a directory) - } - } - - private boolean isInsideNestedJar(String dir) { - return dir.indexOf("!/") < dir.lastIndexOf("!/"); - } - - } - -}