2012-03-05 8 views
6

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.

risposta

3

È possibile disabilitare l'elaborazione delle annotazioni mediante la configurazione per determinati file JAR. L'ho usato solo per i file JAR, potrebbe non funzionare per esploso WAR s. Guardare <tomcat>/conf/catalina.properties, linea 76 (Tomcat 7.0.22):

# List of JAR files that should not be scanned for configuration information 
# such as web fragments, TLD files etc. It must be a comma separated list of 
# JAR file names. 
# The JARs listed below include: 
# - Tomcat Bootstrap JARs 
# - Tomcat API JARs 
# - Catalina JARs 
# - Jasper JARs 
# - Tomcat JARs 
# - Common non-Tomcat JARs 
# - Sun JDK JARs 
# - Apple JDK JARs 
+0

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

+0

@codevour Come hai risolto il tuo problema nel frattempo? – phant0m

0

Esistono alcune proprietà del sistema in Tomcat che consentono il controllo della scansione JAR dal 7.0.30. Controlla la pagina del documento here.

Fondamentalmente questi sono:

  • tomcat.util.scan.DefaultJarScanner.jarsToSkip
  • org.apache.catalina.startup.ContextConfig.jarsToSkip
  • org.apache.catalina.startup.TldConfig.jarsToSkip

Non so qual è il più breve tempo li si può impostare, forse ContextListener?

Problemi correlati