La mise à niveau de Tomcat 8.0.39 à 8.0.41 entraîne des erreurs "échec au balayage"

j'ai une application Spring Boot WAR qui fonctionne parfaitement sous Tomcat 8.0.39 sur AWS. Après l'émission de sudo service tomcat8 stop , la mise à niveau vers Tomcat 8.0.41 par sudo yum update , et le redémarrage de l'instance, l'application ne démarre pas. Dans le fichier journal de catalina, je vois une tonne d'exceptions du type:

19-Feb-2017 10:27:15.326 WARNING [localhost-startStop-1] org.apache.tomcat.util.
scan.StandardJarScanner.scan Failed to scan [file:/usr/share/java/tomcat8/javax.
annotation-api.jar] from classloader hierarchy
 java.io.FileNotFoundException: /usr/share/java/tomcat8/javax.annotation-api.jar
 (No such file or directory)

Voici les fichiers dont Tomcat se plaint:

javax.annotation-api.jar
jsr181-api.jar
jaxb-api.jar
javax.xml.soap-api.jar
FastInfoset.jar
mimepull.jar
saaj-impl.jar
stax2-api.jar
woodstox-core-asl.jar
jaxb-core-2.2.10-b140802.1033.jar
jaxb-api-2.2.12-b140109.1041.jar
istack-commons-runtime-2.19.jar
txw2-2.2.10-b140802.1033.jar
hk2-core.jar
class-model.jar
config.jar
auto-depends.jar
javax.inject.jar
hk2-api.jar
osgi-resource-locator.jar
tiger-types.jar
bean-validator.jar
jtype.jar

des suggestions sur la façon de corriger cela?


mise à Jour #1:

certains des fichiers ci-dessus appartiennent à jaxws-ri . Il s'est avéré que j'avais certains (10), mais pas tous (23), des pots de JAX-WS RI 2.2.10 lib répertoire copié dans le lib répertoire de Tomcat. Après avoir copié les 13 pots manquants, la liste des fichiers dont Tomcat se plaint dans le fichier journal catalina s'est réduite à:

jaxb-core-2.2.10-b140802.1033.jar
jaxb-api-2.2.12-b140109.1041.jar
istack-commons-runtime-2.19.jar
txw2-2.2.10-b140802.1033.jar
hk2-core.jar
class-model.jar
config.jar
auto-depends.jar
javax.inject.jar
hk2-api.jar
osgi-resource-locator.jar
tiger-types.jar
bean-validator.jar
jtype.jar

(Exceptions pour les fichiers ci-dessus sont répété plusieurs fois dans le fichier journal. On dirait que le scanner est invoqué à plusieurs reprises au démarrage, peut-être en scannant différents chemins de classe.)

cela me dit qu'avec la transition de 8.0.39 à 8.0.41, Tomcat est soudainement devenu très difficile sur la présence de tous les pots référencés, même si l'application fonctionne parfaitement sans beaucoup d'entre eux. En outre, Tomcat semble être très particulier sur les constructions spécifiques de certains pots (voir par exemple le jaxb-core... et jaxb-api... jarres ci-dessus).

maintenant, pour corriger cela, je pourrais essayer de trouver tous ces pots manquants et les copier dans le répertoire lib de Tomcat. Cependant, je ne vois aucun moyen d'assurer la source appropriée pour certains d'entre eux en raison de noms génériques, tels que config.jar , ou de numéros de version manquants.

alors, y a-t-il un moyen d'empêcher le scan.StandardJarScanner.scan de Tomcat d'être si pointilleux sur tous ces pots?


mise à Jour #2:

il s'avère que dans Tomcat 8.0.38, un paramètre a été ajouté pour contrôler le balayage jar, dont la valeur par défaut est true . Pour désactiver le balayage, ajouter la ligne suivante dans context.xml :

<Context>
  ...
  <JarScanner scanManifest="false"/>
</Context>

pour plus de détails, voir fournit une option pour désactiver le traitement de l'entrée de chemin de classe dans le fichier de manifeste du jar .

12
demandé sur user1408140 2017-02-19 19:45:45

1 réponses

il y avait un bug, que Tomcat 8 ignore le Class-Path en-tête dans le MANIFEST.MF fichier D'un bocal, voir Bug 59226 :

bogue 59226-Standard Jarscanner ne tient pas compte des bocaux dans la classe du manifeste-en-tête du chemin d'accès

ce bogue a été corrigé avec Tomcat 8.0.34, mais il a produit beaucoup d'avertissements pour les bocaux non requis, voir bogue 59961 :

bogue 59961-fournir une option pour désactiver le traitement de l'entrée de chemin de classe dans le fichier de manifeste d'un jar

depuis Tomcat 8.0.38 vous pouvez désactiver la numérisation du fichier MANIFEST.MF , voir le composant Scanner Jar :

scanManifest

si c'est vrai, les fichiers de manifestes de toutes les jarres trouvées seront scannés pour classe supplémentaire chemin entrées et les entrées seront ajoutées à l'Url à analyser. La valeur par défaut est true.

12
répondu dur 2017-03-24 15:12:04