Restrictions de démarrage de printemps sur le support JSP
Pour la prise en charge de JSP, Spring Boot ne prend en charge que la méthode de la guerre de l'emballage et ne prend pas en charge Fat Jar. Reportez-vous au document officiel: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-deatures-jsp-limitations
Ici, Spring Boot dit officiellement que c'est un problème avec Tomcat, mais il est en fait causé par Spring Boot lui-même modifiant le format d'emballage. Reportez-vous aux articles précédents: http://www.vevb.com/article/141479.htm
Dans le cadre de la structure d'origine, Tomcat peut scanner des ressources sous le répertoire META-INF/resources dans le pot de graisse. Après avoir ajouté BOOT-INF/classes , Tomcat ne peut pas numériser.
Alors, comment résoudre ce problème? Voici une solution pour obtenir la prise en charge du JSP de Spring Boot Fat Jar / Explosed Directory.
Personnalisez Tomcat et ajoutez des cours / classes à Tomcat's ResourcesSet
À Tomcat, toutes les ressources numérisées seront placées dans le soi-disant ResourceSet . Par exemple, META-INF/resources du package de pot d'application dans la spécification Servlet 3 est un ResourceSet .
Maintenant, nous devons trouver un moyen d'ajouter le répertoire BOOT-INF/classes du JAR FAT qui est frappé par Spring Boot à ResourceSet .
Ensuite, en mettant en œuvre l'interface LifeCycleListener de TomCat, obtenez l'URL de Boot-Inf / Classes dans l'événement Lifecycle.Configure_Start_Event, puis ajoutez cette URL à The WeBresourceset.
/ ** * Ajouter un répertoire de gras de classe principale / explosé dans Tomcat ResourcesSet. * * @author Hengyunabc 2017-07-29 * * / classe publique StaticResourceConfigurer implémente LifecycleListener {contexte final privé; StaticResourceConfigurer (contexte de contexte) {this.context = context; } @Override public void lifecycleEvent (lifecycleEvent Event) {if (event.getType (). Equals (lifecycle.configure_start_event)) {URL Location = this.getClass (). GetProtectionDomain (). GetcodEource (). GetLocy (); if (ressourceUtils.isfileUrl (emplacement)) {// lors de l'exécution en tant que chaîne de répertoire explosée rootfile = location.getFile (); if (rootfile.endswith ("/ boot-inf / classes /")) {rootfile = rootfile.substring (0, rootfile.length () - "/ boot-inf / classes /". length () + 1); } if (! nouveau fichier (rootfile, "meta-inf" + file.separator + "ressources"). IsDirectory ()) {return; } essayez {location = nouveau fichier (rootfile) .touri (). tourl (); } catch (MalformEdUrlexception e) {Throw New illégalStateException ("ne peut pas ajouter de ressources tomcat", e); }} String LocationStr = location.toString (); if (locationstr.endswith ("/ boot-inf / classes! /")) {// Lorsqu'il est exécuté en tant que jar fat locationstr = locationstr.substring (0, locationstr.length () - "/ boot-inf / classes! /". length () + 1); try {location = new URL (LocationStr); } catch (MalformEdUrlexception e) {Throw New illégalStateException ("ne peut pas ajouter de ressources tomcat", e); }} this.context.getResources (). CreateWebresourceset (ResourcesetType.resource_jar, "/", emplacement, "/ meta-inf / ressources"); }}}Afin de fabriquer des tomcat intégrés à Spring Boot, ce staticResourceConfigurer, une configuration EmbedDedServletContainerCusizer est également requise:
@ Configuration @ conditionalonProperty (name = "tomcat.statingResourceCustomizer.enable Persuhalize (ConfigurableEmbedDeDServletContainer Container) {if (instance de conteneur de tomcatembeddedServletContainerFactory) {(TomCatembedDedServletContainerFactory) Container) .AddContextCustomzers (Context TomcatConTextCustoriz context.addlifecycleListener (new staticResourceConfigurer (contexte));}}); }}}; }}De cette façon, Spring Boot peut prendre en charge les ressources JSP dans Fat Jar.
Adresse de démonstration: https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample
Résumer
BOOT-INF/classes en gros pot/BOOT-INF/classes dans le gros pot StaticResourceConfigurer ResourceSet de TomcatCe qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.