Que faire avec les annotations après avoir défini metadata-complete="true" (qui a résolu Tomcat lent 7 start-up)?

semble comme le problème lent de démarrage Tomcat 7 peut être résolu avec" metadata-complete "mis à" 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 scanne les annotations au démarrage, ce qui le ralentit considérablement. Mon temps est réduit de 25 secondes à 5 secondes. (Plus d'informations ici: Tomcat et Servlet 3.0 Configuration Web )

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

@ManagedBean
@RequestScoped
@Override
...

je suis confus - mon code fonctionnera-t-il après que j'ai défini des métadonnées-complete="true"? Est-ce que je dois enlever les annotations et tout déplacer dans le web.xml?

38
demandé sur skaffman 2012-03-22 14:24:31

2 réponses

le démarrage lent est causé parce que chaque fichier de classe dans chaque fichier JAR dans /WEB-INF/lib est également scanné pour des annotations spécifiques Servlet 3.0. Vous avez apparemment beaucoup de fichiers JAR dans /WEB-INF/lib .

le metadata-complete="true" indique que les fichiers JAR dans /WEB-INF/lib n'ont pas besoin d'être scannés pour des annotations spécifiques Servlet 3.0, mais les propres classes de la webapp seront quand même scannées.

notez que vous y êtes deux annotations JSF et une annotation Java SE, pas toutes les annotations Servlet 3.0. Les annotations Servlet 3.0 sont listées dans le paquet javax.servlet.annotation . JSF ne recherchera les annotations que si le fichier JAR contient un fichier /META-INF/faces-config.xml compatible JSF 2.0. Il ne scannera pas immédiatement chaque classe dans chaque fichier JAR. L'annotation Java SE @Override n'est pas une annotation d'exécution, mais une aide de compilation seulement.

Voir aussi:

65
répondu BalusC 2017-05-23 12:17:58

voici ce que Java Servlet 3.0 / 3.1 spécification doit dire:

le descripteur de déploiement de l'application web contient un métadonnées-complet attribut sur l'élément Web-app . Le métadonnées "achever 1519100920" attribut définit si le web.le descripteur xml est complet ou si source des métadonnées utilisées dans le cadre du processus de déploiement devraient être considérer. Les métadonnées peuvent provenir du site web .xml fichier", 151990920" web-fragment.xml fichiers, annotations sur les fichiers de classe dans WEB-INF / classes , et annotations sur les classes dans des fichiers jar dans le WEB-INF/lib répertoire. Si métadonnées "achever 1519100920" est défini sur "true", l'outil de déploiement examine seulement le web .XML fichier et doit ignorer les annotations telles que @WebServlet , @WebFilter , et @WebListener présents dans les fichiers de classe de la application, et doivent également ignorer tout web-fragment.descripteur xml emballé dans un fichier jar dans WEB-INF/lib . Si les métadonnées - compléter l'attribut n'est pas spécifié ou est à "false", le déploiement outil doit examiner les fichiers de classe et web-fragment.fichiers xml pour les métadonnées,comme indiqué précédemment.

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

10
répondu Ivan Hristov 2016-04-12 08:58:58