ข้อ จำกัด การบูตฤดูใบไม้ผลิเกี่ยวกับการสนับสนุน JSP
สำหรับการสนับสนุนของ JSP สปริงบูตรองรับวิธีการบรรจุภัณฑ์ของสงครามเท่านั้นและไม่รองรับขวดไขมัน อ้างถึงเอกสารอย่างเป็นทางการ: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations
ที่นี่ Spring Boot อย่างเป็นทางการบอกว่ามันเป็นปัญหากับ Tomcat แต่จริงๆแล้วมันเกิดจากการบูตฤดูใบไม้ผลิเองเปลี่ยนรูปแบบบรรจุภัณฑ์ อ้างถึงบทความก่อนหน้า: http://www.vevb.com/article/141479.htm
ภายใต้โครงสร้างดั้งเดิม Tomcat สามารถสแกนทรัพยากรภายใต้ไดเรกทอรี META-INF/resources ในขวดไขมัน หลังจากเพิ่ม BOOT-INF/classes แล้ว Tomcat ไม่สามารถสแกนได้
แล้วจะแก้ปัญหานี้ได้อย่างไร? นี่คือวิธีแก้ปัญหาเพื่อให้ได้รับการสนับสนุนสำหรับ JSP ของ Spring Boot Fat Jar/Directory Exploded
ปรับแต่ง tomcat และเพิ่ม boot-inf/คลาสลงใน Resourceset ของ Tomcat
ใน Tomcat ทรัพยากรที่สแกนทั้งหมดจะถูกวางไว้ใน ResourceSet ที่เรียกว่า ตัวอย่างเช่น META-INF/resources ของแพ็คเกจ jar แอปพลิเคชันในข้อกำหนด servlet 3 เป็น ResourceSet
ตอนนี้เราต้องหาวิธีเพิ่มไดเรกทอรี BOOT-INF/classes ของขวดไขมันที่ถูกโจมตีโดย Spring Boot ไปยัง ResourceSet
ถัดไปโดยการใช้อินเตอร์เฟส LifecycleListener ของ Tomcat รับ URL ของ boot-inf/คลาสใน Lifecycle.configure_start_event เหตุการณ์จากนั้นเพิ่ม URL นี้ลงใน WebResourceset
/*** เพิ่ม Jar Fat Main Class/Directory Exploded ลงใน Tomcat Resourceset * * @author Hengyunabc 2017-07-29 * */คลาสสาธารณะ StaticResourceConfigurer ใช้ LifecycleListener {บริบทสุดท้ายส่วนตัว; StaticResourceConfigurer (บริบทบริบท) {this.context = บริบท; } @Override โมฆะสาธารณะ LifeCycleEvent (เหตุการณ์ LifeCycleEvent) {ถ้า (Event.getType (). Equals (Lifecycle.configure_start_event)) {ตำแหน่ง url = this.getClass () GetProtectionDomain () GetCodeSource () if (ResourceUtils.isfileUrl (ตำแหน่ง)) {// เมื่อเรียกใช้เป็นสายไดเรกทอรีที่ระเบิด rotofile = location.getFile (); if (rootfile.endswith ("/boot-inf/classes/")) {rootfile = rootfile.substring (0, rootfile.length ()-"/boot-inf/classes/". length () + 1); } if (! ไฟล์ใหม่ (rootfile, "meta-inf" + file.Sparator + "ทรัพยากร"). isDirectory ()) {return; } ลอง {location = ไฟล์ใหม่ (rootfile) .touri (). tourl (); } catch (malformedurlexception e) {โยน unlueLstateException ใหม่ ("ไม่สามารถเพิ่มทรัพยากร tomcat", e); }} สตริง locationStr = location.toString (); if (locationstr.endswith ("/boot-inf/คลาส!/")) {// เมื่อเรียกใช้เป็น jar fat locationstr = locationStr.substring (0, locationStr.length ()-"/boot-inf/คลาส!/". length () + 1); ลอง {location = url ใหม่ (LocationStr); } catch (malformedurlexception e) {โยน unlueLstateException ใหม่ ("ไม่สามารถเพิ่มทรัพยากร tomcat", e); }} this.context.getResources (). CreateWebresourceset (ResourcesetType.resource_jar, "/", ที่ตั้ง, "/meta-inf/resources"); -เพื่อให้สปริงบู๊ตฝังตัว Tomcat ฝังตัว Tomcat โหลด StaticResourceConfigurer นี้จำเป็นต้องมีการกำหนดค่า EmbeddedServletContainerCustomizer ด้วย:
@Configuration @conditionalOnProperty (name = "tomcat.staticResourceustomizer.enabled", matchifmissing = true) คลาสสาธารณะ tomcatconfiguration {@bean สาธารณะฝังตัว ปรับแต่ง (ConfigureDededDedServletContainer Container) {ถ้า (คอนเทนเนอร์อินสแตนซ์ของ tomcatembeddedservletContainerFactory) {((tomcatembeddedservletContainerFactory) คอนเทนเนอร์) .AddContextCustomizers Context.addlifecycleListener (ใหม่ StaticResourceConfigurer (บริบท));}}); - -ด้วยวิธีนี้การบูต Spring สามารถรองรับทรัพยากร JSP ใน Fat Jar
ที่อยู่ตัวอย่าง: https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample
สรุป
BOOT-INF/classes ในขวดไขมัน/BOOT-INF/classes ในขวดไขมัน StaticResourceConfigurer ResourceSet ของ tomcatข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น