Pembatasan Boot Musim Semi pada Dukungan JSP
Untuk dukungan JSP, Spring Boot hanya mendukung metode pengemasan perang, dan tidak mendukung toples lemak. Lihat Dokumen Resmi: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations
Di sini, Spring Boot secara resmi mengatakan itu adalah masalah dengan Tomcat, tetapi sebenarnya disebabkan oleh boot Spring itu sendiri mengubah format pengemasan. Lihat Artikel Sebelumnya: http://www.vevb.com/article/141479.htm
Di bawah struktur asli, Tomcat dapat memindai sumber daya di bawah direktori META-INF/resources di toples lemak. Setelah menambahkan BOOT-INF/classes , Tomcat tidak dapat memindai.
Jadi bagaimana cara menyelesaikan masalah ini? Berikut ini adalah solusi untuk mencapai dukungan untuk JSP dari Spring Boot Fat Toples/Exploded Directory.
Personalisasi Tomcat dan tambahkan boot-inf/kelas ke sumber daya Tomcat
Di Tomcat, semua sumber daya yang dipindai akan ditempatkan di apa yang disebut ResourceSet . Misalnya, META-INF/resources paket JAR aplikasi dalam spesifikasi Servlet 3 adalah ResourceSet .
Sekarang kita perlu menemukan cara untuk menambahkan direktori BOOT-INF/classes dari toples lemak yang diserang oleh Spring Boot ke ResourceSet .
Selanjutnya, dengan mengimplementasikan antarmuka LifeCyClelistener dari Tomcat, dapatkan URL boot-inf/kelas di acara lifecycle.configure_start_event, dan kemudian tambahkan URL ini ke WebResourceset.
/*** Tambahkan Jar Fat Kelas Utama/Direktori Meledak ke Tomcat Resourceset. ? StaticResourCeConfigurer (konteks konteks) {this.context = konteks; } @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)) {// saat dijalankan sebagai string direktori yang meledak rootFile = location.getFile (); if (rootfile.endswith ("/boot-inf/class/")) {rootFile = rootfile.substring (0, rootFile.length ()-"/boot-inf/class/". length () + 1); } if (! File baru (rootfile, "meta-inf" + file.separator + "sumber daya"). isDirectory ()) {return; } coba {location = file baru (rootfile) .touri (). Tourl (); } catch (Malformedurlexception e) {lempar baru ilegalstateException ("tidak dapat menambahkan sumber daya tomcat", e); }} String locationstr = location.toString (); if (locationstr.endswith ("/boot-inf/class!/")) {// Saat dijalankan sebagai fat top-locationstr = locationstr.substring (0, locationstr.length ()-"/boot-inf/class!/". Length () + 1); coba {location = URL baru (Lokasi); } catch (Malformedurlexception e) {lempar baru ilegalstateException ("tidak dapat menambahkan sumber daya tomcat", e); }} this.context.getResources (). Createwebresourceset (Resourcesetypye.resource_jar, "/", Lokasi, "/Meta-Inf/Resources"); }}}Untuk membuat muatan tomcat tertanam pegas memuat staticResourconfigurer ini, konfigurasi embeddedServletContainerCustomizer juga diperlukan:
@Configuration @conditionAnproperty (name = "tomcat.staticResourcustomizer.enabled", matchifmissing = true) tomcatconfiguration Kustomisasi (Konfigurasi yang Dikonfigurasi Container Container) {if (container instance dari tomcatembedDedSerVletContainerFactory) {((contextomizer contuctice (contextcontextExeReCeReDe contextContextEricory (). context.addlifecyclelistener (staticResourCeConfigurer baru (konteks)); }}}; }}Dengan cara ini, Spring Boot dapat mendukung sumber daya JSP dalam toples lemak.
Alamat demo: https://github.com/hengyunabc/spring-boot-fat-jar-jsp-sample
Meringkaskan
BOOT-INF/classes dalam toples lemak/BOOT-INF/classes dalam toples lemak StaticResourceConfigurer ResourceSet tomcatDi atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.