麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

深入Spring Boot實現對Fat Jar jsp的支持

2024-07-14 08:41:09
字體:
來源:轉載
供稿:網友

spring boot 對于jsp支持的限制

對于jsp的支持,Spring Boot官方只支持了war的打包方式,不支持fat jar。參考官方文檔: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations

這里spring boot官方說是tomcat的問題,實際上是spring boot自己改變了打包格式引起的。

原來的結構之下,tomcat是可以掃描到fat jar里的META-INF/resources目錄下面的資源的。在增加了BOOT-INF/classes之后,則tomcat掃描不到了。

那么怎么解決這個問題呢?下面給出一種方案,來實現對spring boot fat jar/exploded directory的jsp的支持。

個性化配置tomcat,把BOOT-INF/classes 加入tomcat的ResourceSet

在tomcat里,所有掃描到的資源都會放到所謂的ResourceSet里。比如servlet 3規范里的應用jar包的META-INF/resources就是一個ResourceSet

現在需要想辦法把spring boot打出來的fat jar的BOOT-INF/classes目錄加到ResourceSet里。

下面通過實現tomcat的 LifecycleListener接口,在Lifecycle.CONFIGURE_START_EVENT事件里,獲取到BOOT-INF/classes的URL,再把這個URL加入到WebResourceSet里。

/** * Add main class fat jar/exploded directory into tomcat ResourceSet. * * @author hengyunabc 2017-07-29 * */public class StaticResourceConfigurer implements LifecycleListener { private final Context context; StaticResourceConfigurer(Context context) {  this.context = context; } @Override public void lifecycleEvent(LifecycleEvent event) {  if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {   URL location = this.getClass().getProtectionDomain().getCodeSource().getLocation();   if (ResourceUtils.isFileURL(location)) {    // when run as exploded directory    String rootFile = location.getFile();    if (rootFile.endsWith("/BOOT-INF/classes/")) {     rootFile = rootFile.substring(0, rootFile.length() - "/BOOT-INF/classes/".length() + 1);    }    if (!new File(rootFile, "META-INF" + File.separator + "resources").isDirectory()) {     return;    }    try {     location = new File(rootFile).toURI().toURL();    } catch (MalformedURLException e) {     throw new IllegalStateException("Can not add tomcat resources", e);    }   }   String locationStr = location.toString();   if (locationStr.endsWith("/BOOT-INF/classes!/")) {    // when run as fat jar    locationStr = locationStr.substring(0, locationStr.length() - "/BOOT-INF/classes!/".length() + 1);    try {     location = new URL(locationStr);    } catch (MalformedURLException e) {     throw new IllegalStateException("Can not add tomcat resources", e);    }   }   this.context.getResources().createWebResourceSet(ResourceSetType.RESOURCE_JAR, "/", location,     "/META-INF/resources");  } }}

為了讓spring boot embedded tomcat加載這個 StaticResourceConfigurer,還需要一個EmbeddedServletContainerCustomizer的配置:

@Configuration@ConditionalOnProperty(name = "tomcat.staticResourceCustomizer.enabled", matchIfMissing = true)public class TomcatConfiguration { @Bean public EmbeddedServletContainerCustomizer staticResourceCustomizer() {  return new EmbeddedServletContainerCustomizer() {   @Override   public void customize(ConfigurableEmbeddedServletContainer container) {    if (container instanceof TomcatEmbeddedServletContainerFactory) {     ((TomcatEmbeddedServletContainerFactory) container)       .addContextCustomizers(new TomcatContextCustomizer() {        @Override        public void customize(Context context) {         context.addLifecycleListener(new StaticResourceConfigurer(context));        }       });    }   }  }; }}

 這樣子的話,spring boot就可以支持fat jar里的jsp資源了。

demo地址: https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample

總結

  1. spring boot改變了打包結構,導致tomcat沒有辦法掃描到fat jar里的/BOOT-INF/classes
  2. 通過一個StaticResourceConfigurer把fat jar里的/BOOT-INF/classes加到tomcat的ResourceSet來解決問題

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 羞羞视频一区二区 | 欧美日韩国产一区二区三区在线观看 | av在线日韩 | 午夜视频啊啊啊 | 欧美视屏一区二区 | 日韩电影一区二区 | 91精品欧美一区二区三区 | 在线免费观看精品 | 久久精品一区二区三区国产主播 | 精品久久久久久久久久久久久 | 国产成人综合在线 | 久久草在线观看视频 | 亚洲最大的成人网 | 欧美日韩一 | 国产亚洲精品一区二区三区 | 日日爱99| 欧美aⅴ视频 | 中国的免费的视频 | 色诱亚洲精品久久久久久 | 欧美一级毛片大片免费播放 | 31freehdxxxx欧美| 国产老师做www爽爽爽视频 | 成年人视频在线免费播放 | 九一免费版在线观看 | 成人男女激情免费视频 | 黄色大片高清 | 天天看成人免费毛片视频 | 欧美18一12sex性处hd | 国产羞羞视频 | 九九热免费视频在线观看 | 色偷偷一区 | 性盈盈盈影院 | 亚洲国产一区二区三区 | 久久99精品久久 | 久久久av亚洲男天堂 | 国产成人精品一区二区三区电影 | 国产成人高清成人av片在线看 | 中文字幕亚洲情99在线 | 麻豆自拍偷拍视频 | jizzzxxxxhd| 欧洲精品久久久 |