web-dev-qa-db-fra.com

Que faire des annotations après avoir défini metadata-complete = "true" (qui a résolu le démarrage lent de Tomcat 7)?

Il semble que le problème de démarrage lent de Tomcat 7 puisse être résolu avec "metadata-complete" défini sur "true" dans le web.xml, comme ceci:

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" id="WebApp_ID" version="3.0"...

Le problème est que Tomcat recherche des annotations au démarrage, ce qui le ralentit considérablement. Mon temps est réduit de 25 à 5 secondes. (Plus d'informations ici: Configuration Web de Tomcat et Servlet 3. )

Cependant, j'ai quelques annotations dans mon code, comme:

@ManagedBean
@RequestScoped
@Override
...

Je suis confus - mon code fonctionnera-t-il après avoir défini metadata-complete = "true"? Dois-je supprimer des annotations et tout déplacer dans web.xml?

40
Danijel

Le démarrage lent est dû au fait que chaque fichier de classe unique dans chaque fichier JAR unique dans /WEB-INF/lib est également analysé pour les annotations spécifiques à Servlet 3.0. Vous avez apparemment beaucoup de (gros) fichiers JAR dans /WEB-INF/lib.

Le metadata-complete="true" indique que les fichiers JAR dans /WEB-INF/lib n'a pas besoin d'être analysé pour les annotations spécifiques à Servlet 3.0, mais les propres classes de la webapp seront toujours analysées.

Notez que vous y avez répertorié deux annotations JSF et une annotation Java SE, pas d’annotations Servlet 3.0. Les annotations Servlet 3.0 sont répertoriées dans javax.servlet.annotation package. JSF ne recherchera les annotations que lorsque le fichier JAR contient un _ compatible JSF 2.0 /META-INF/faces-config.xml fichier. Il n'analysera pas immédiatement chaque classe de chaque fichier JAR. Le Java SE @Override annotation n'est pas une annotation d'exécution, mais uniquement une aide à la compilation.

Voir également:

68
BalusC

Voici ce que Java Servlet . / .1 La spécification doit dire:

Le descripteur de déploiement d'application Web contient un attribut metadata-complete sur l'application Web élément. L'attribut metadata-complete définit si le descripteur web.xml est complet , ou si d'autres sources de métadonnées utilisées par le processus de déploiement doivent être prises en compte. Les métadonnées peuvent provenir du fichier web.xml , web-fragment.xml , les annotations sur les fichiers de classe dans WEB-INF/classes et les annotations sur les classes dans les fichiers jar dans Répertoire WEB-INF/lib . Si metadata-complete est défini sur "true", l'outil de déploiement examine uniquement le web.xml et doit ignorer les annotations telles que @ WebServlet , @ WebFilter et @ WebListener présent dans les fichiers de classe de l'application, et doit également ignorer tout web -fragment.xml descripteur emballé dans un fichier jar dans WEB-INF/lib . Si l'attribut metadata-complete n'est pas spécifié ou est défini sur "false", l'outil de déploiement doit examiner les fichiers de classe et fichiers web-fragment.xml pour les métadonnées, comme spécifié précédemment.

Cela étant dit et pour répondre à votre question: Oui, afin d'optimiser le temps de démarrage de Tomcat, vous devez utiliser metadata-complete="true" et placez chaque servlet ou filtre ou écouteur dans votre descripteur de déploiement.

12
Ivan Hristov