Restrições de bota de primavera no suporte JSP
Para o apoio do JSP, a Spring Boot suporta apenas o método de guerra de embalagem e não suporta o Fat Jar. Consulte o documento oficial: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-develop-web-applications.html#boot-features-jsp-limitations
Aqui, a Spring Boot diz oficialmente que é um problema com o Tomcat, mas na verdade é causado pela própria bota da primavera, alterando o formato de embalagem. Consulte os artigos anteriores: http://www.vevb.com/article/141479.htm
Sob a estrutura original, o Tomcat pode digitalizar recursos no diretório de META-INF/resources no frasco de gordura. Depois de adicionar BOOT-INF/classes , o Tomcat não pode digitalizar.
Então, como resolver esse problema? Aqui está uma solução para obter suporte para o JSP do Spring Boot Gord Jar/Exploded Directory.
Personalize o tomcat e adicione boot-inf/classes aos recursos do Tomcat
No Tomcat, todos os recursos digitalizados serão colocados no chamado ResourceSet . Por exemplo, META-INF/resources do pacote de jar de aplicativos na especificação Servlet 3 é um ResourceSet .
Agora, precisamos encontrar uma maneira de adicionar o diretório BOOT-INF/classes do frasco de gordura que é atingido pela Spring Boot ao ResourceSet .
Em seguida, implementando a interface LifeCycleListener do tomcat, obtenha o URL de boot-inf/classes no evento Lifecycle.configure_start_event e adicione este URL ao webresourcesset.
/*** Adicione o diretório de gordura de classe principal/diretório explodido no Tomcat ResourceSet. * * @author hengyunabc 2017-07-29 * */public class StaticResourceConfigurer implementa LifeCycleListener {contexto final privado; StaticResourceConfigurer (contexto de contexto) {this.Context = context; } @Override public void LifeCycleEvent (Evento LifeCycleEvent) {if (event.gettype (). Equals (LifeCycle.configure_start_event)) {URL Location = this.getClass (). GetProtectionDomain (). GetCodesource (). if (Resourceutils.isfilEurl (localização)) {// quando executado como diretório explodido String rootfile = location.getFile (); if (rootfile.endswith ("/boot-inf/classes/")) {rootfile = rootfile.substring (0, rootfile.length ()-"/boot-inf/classes/". length () + 1); } if (! novo arquivo (rootfile, "meta-inf" + file.separator + "recursos"). isDirectory ()) {return; } tente {location = novo arquivo (rootfile) .Touri (). TourL (); } catch (malformedUrlexception e) {lança nova ilegalStateException ("não pode adicionar recursos do tomcat", e); }} String locationstr = location.toString (); if (locationstr.endswith ("/boot-inf/classes!/")) {// quando executado como jarra gordo locationstr = locationstr.substring (0, locationtr.Length ()-"/boot-inf/classes!/". Length () + 1); tente {location = new URL (locationstr); } catch (malformedUrlexception e) {lança nova ilegalStateException ("não pode adicionar recursos do tomcat", e); }} this.Context.GetResources (). CreateWeBresourceSet (ResourceSetType.Resource_Jar, "/", Local, "/meta-inf/Resources"); }}}Para fazer com que a bota de primavera incorporasse o Tomcat Carregar este StaticResourceConfigurer, também é necessária uma configuração incorporada do SERVEVLECTONCONTERCUSTOMizer:
@Configuration @condicionalonProperty (name = "tomcat.staticResourceCustomizer.enabled", matchifmissing = true) classe pública TomCatConfiguration {@Bean public incorporado @TiSVErTErSerCOrSERCOUSTOMizer StaticResourCustomizer () {Return NewbdedServletLeRContOnSertContomizer Customize (configurabilyEmbedededservletContainer Container) {if (Instância do contêiner de tomcatembeddedservletContainerFactory) {((tomcatembeddedservletContainerFactory) contêiner) .AddContextCustomizer (New TomCatContextCustomer () { Context.AddlifeCycleListener (novo StaticResourceConfigurer (contexto)); }}}; }}Dessa forma, a Spring Boot pode suportar recursos JSP em Fat Jar.
Endereço de demonstração: https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample
Resumir
BOOT-INF/classes em jarra de gordura/BOOT-INF/classes no frasco de gordura StaticResourceConfigurer ResourceSet do TomcatO exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.