最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入Spring Boot實現(xiàn)對Fat Jar jsp的支持

 更新時間:2018年06月05日 09:25:57   作者:hengyunabc  
這篇文章主要介紹了深入Spring Boot實現(xiàn)對Fat Jar jsp的支持,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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自己改變了打包格式引起的。參考之前的文章:http://m.fzitv.net/article/141479.htm

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

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

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

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

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

下面通過實現(xiàn)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來解決問題

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

相關文章

  • 解讀@ConfigurationProperties的基本用法

    解讀@ConfigurationProperties的基本用法

    這篇文章主要介紹了@ConfigurationProperties的基本用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java中十進制和十六進制的相互轉換方法

    Java中十進制和十六進制的相互轉換方法

    下面小編就為大家?guī)硪黄狫ava中十進制和十六進制的相互轉換方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Java利用Socket類實現(xiàn)TCP通信程序

    Java利用Socket類實現(xiàn)TCP通信程序

    TCP通信能實現(xiàn)兩臺計算機之間的數(shù)據(jù)交互,通信的兩端,要嚴格區(qū)分為客戶端與服務端,下面我們就來看看Java如何利用Socket類實現(xiàn)TCP通信程序吧
    2024-02-02
  • Java中的日期時間處理及格式化處理

    Java中的日期時間處理及格式化處理

    這篇文章主要介紹了Java中的日期時間處理及格式化處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java按照模板導出pdf或word文件詳細代碼

    java按照模板導出pdf或word文件詳細代碼

    有時候業(yè)務中我們需要使用pdf模板生成一份pdf文件,下面這篇文章主要給大家介紹了關于java按照模板導出pdf或word文件的相關資料,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-11-11
  • Java自定義異常簡單示例

    Java自定義異常簡單示例

    使用Java內置的異常類可以描述在編程時出現(xiàn)的大部分異常情況,除此之外用戶還可以自定義異常,下面這篇文章主要給大家介紹了關于Java自定義異常的相關資料,需要的朋友可以參考下
    2023-04-04
  • ArrayList集合初始化及擴容方式

    ArrayList集合初始化及擴容方式

    這篇文章主要介紹了關于ArrayList集合初始化及擴容方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Springboot中spring-boot-starter-quartz的使用及說明

    Springboot中spring-boot-starter-quartz的使用及說明

    這篇文章主要介紹了Springboot中spring-boot-starter-quartz的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • idea實現(xiàn)類快捷生成接口方法示例

    idea實現(xiàn)類快捷生成接口方法示例

    這篇文章主要介紹了idea實現(xiàn)類快捷生成接口方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • springboot中.yml文件的值無法讀取的問題及解決

    springboot中.yml文件的值無法讀取的問題及解決

    這篇文章主要介紹了springboot中.yml文件的值無法讀取的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

尼木县| 武威市| 咸丰县| 龙海市| 宁乡县| 筠连县| 任丘市| 奉节县| 江阴市| 桓仁| 北宁市| 天长市| 南川市| 宿松县| 盐源县| 宜川县| 平度市| 连平县| 广平县| 卢龙县| 海南省| 珲春市| 长春市| 金乡县| 内乡县| 遂川县| 无锡市| 和静县| 门源| 桐柏县| 静宁县| 南宁市| 盐亭县| 化德县| 同心县| 西贡区| 瑞安市| 武宁县| 咸阳市| 蓝田县| 肃宁县|