Abbiamo migrato di recente all'API Servlet 3.0. Poiché stiamo sviluppando un framework che a volte richiede alcune modifiche nello web.xml
, i progetti basati sul nostro framework devono aggiornare il loro web.xml
ogni volta che viene apportata una modifica al framework.Utilizzare i frammenti Web (Servlet API 3.0) in un ambiente di progetto enorme
Servlet API 3.0 introduce i nuovi frammenti Web, che rendono questo comportamento più agevolmente accoppiato e dinamico. Creo un web-fragment.xml
e trasferisco tutte le nostre risorse dal web.xml. Quindi i progetti ora devono solo definire il seguente web.xml
e le loro dichiarazioni aggiuntive.
<?xml version="1.0" encoding="UTF-8"?>
<web-app
version="3.0"
metadata-complete="false"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>
dobbiamo usare metadata-complete="false"
per abilitare la ricerca Frammento in vasi (il nostro quadro ha la web-fragment.xml
in META-INF/
.
Dal momento che abbiamo molte dipendenze verso altri framework e librerie (circa 80-90) e la metadata-complete="false"
innesca anche la ricerca di annotazioni ci vogliono fino a inaccettabili 12 secondi per la ricerca in tutte le librerie.
il meccanismo così com'è funziona alla grande e mi piace il fatto che ci sono più decou dalla nostra struttura, ma il tempo di avvio è fatale! Inoltre dobbiamo aumentare la memoria disponibile per Tomcat da -Xms256m -Xmx512m
a -Xms512m -Xmx1024m
per iniziare senza ottenere un java.lang.OutOfMemoryError: Java heap space
(causato dal processore di annotazione implementato in modo inefficiente del Tomcat (circa 50.000 classi sono memorizzate nella cache)).
So che siamo in grado di disattivare la ricerca delle annotazioni all'interno di una libreria, ma come si usa per lo più di terze parti che non hanno la bandiera metadata-complete="true"
, questo non è anche un'opzione.
Possiamo fare qualcosa per disabilitare la ricerca di annotazioni? Oppure possiamo forzare il container servlet a cercare solo nelle librerie dichiarate per lo web-fragment.xml
?
Mi piacerebbe molto utilizzare la nuova funzione di frammento del web, ma con l'aumento del tempo di avvio e della memoria questo non è possibile.
Questa è davvero una soluzione, grazie! Sfortunatamente questa sarebbe una soluzione dipendente dal container servlet. L'obiettivo è eseguire su ogni contenitore di servlet, quindi questa soluzione non è una buona scelta per noi. – codevour
@codevour Come hai risolto il tuo problema nel frattempo? – phant0m