2009-04-08 17 views
1

Tomcat Version: 5.0.28 JDK: 1.5.0.14Tomcat ne peux pas pick-chemin de classe du fichier Manifest

Le problème:

J'utilise à la fois mise en veille prolongée et jambes de force Nous ne sommes pas sur la Donc, les deux ont besoin d'une version différente de la bibliothèque apache-commons.

La solution que j'ai à l'esprit:

Utiliser le fichier manifeste et spécifiez une autre version de apache-communes pour chaque

Mon application Web est déployée comme webapps \ myapp

Et la lib est webapps \ monapp \ WEB-INF \ lib

J'ai modifié le Manifest.mf dans hibernate3.jar comme suit

Manifest-Version: 1.0

-Version Archiveur: Plexus Archiveur Créé par-: 1.5.0_15-b04 (Sun> Microsystems Inc.) Class-Path: hibernatelib/slf4j-api-1.5 .2.jar

et mettre le slf4j-api-1.5.2.jar dans webapps \ myapp \ WEB-INF \ lib \ hibernatelib

maintenant j'attendre à ce que slf4j-api-1.5. 2.jar serait chargé automatiquement avec Hibernate Mais sa ne fonctionne pas ... Tomcat est incapable de trouver les fichiers jar spécifiés dans le .mf comme ci-dessus

La question:

  1. Est-ce que je fais quelque chose de mal? ou est-ce Tomcat?
  2. Existe-t-il une autre solution à ce problème?

J'ai déjà essayé \ vérifié la suivante

  1. VÉRIFIÉ caractères de nouvelle ligne à la fin du fichier
  2. Si je mets slf4j-api-1.5.2.jar dans le principal lib dossier- l'erreur va loin- Je sais que si ce ne est pas en mesure de trouver ce fichier jar particulier
  3. Essayé relative, chemin absolu dans le fichier manifeste

Répondre

0

Le seul emplacement où l'attribut Class-Path est utilisé dans le manifeste est lorsque le jar contenant le manifeste est appelé en tant que fichier exécutable en utilisant ("java -jar theFile.jar").

Certains conteneurs de servlets semblent le supporter, mais selon to this mailing list post (Désolé, rien de plus autoritaire n'a été trouvé aussi rapidement), il n'est pas non plus spécifié dans la spécification. Pour autant que je sache, les applications Web chargent généralement leurs classes en utilisant un chargeur de classe unique. "Correctement" résoudre ce problème de dépendance nécessiterait au moins 2 classloaders différents.

Une solution hack-ish pourrait être d'utiliser jarjar ou un outil similaire pour empaqueter les différentes bibliothèques avec leurs dépendances respectives.

Vous souhaitez produire un jar contenant Hibernate avec sa bibliothèque apache-communes et un autre jar contenant des entretoises ainsi que sa bibliothèque apache-commons. Chaque copie de la bibliothèque apache-commons serait déplacée vers différents paquets (éventuellement hibernate.org.apache.* et struts.org.apache.*) pour résoudre le problème avec différentes versions de classe.

+0

Très bien, alors comment pouvez-vous réaliser ce que je suis en train de faire? J'ai une bibliothèque partagée entre deux bibliothèques différentes Comment les concilier? –

+0

Kool Cela aide J'ai essayé de répondre à votre question, mais je n'ai pas eu assez de représentants :) –

+0

Pas de problème, content que je puisse vous aider. –

0

Avez-vous vérifié les autorisations sont correctes? Aussi peut-être une idée pour m'assurer qu'il y a une nouvelle ligne après la dernière ligne Class-Path, qui m'a aidé plus tôt aujourd'hui!


Mise à jour: si Tomcat ne prend pas en charge les déclarations de classpath comme ça, la seule chose qui vient à l'esprit perturber le fonctionnement avec classloaders. Personnellement, je ne ferais pas cela - il y a tout un monde de douleur potentielle sur cette voie et vous aurez probablement plus de facilité à vous améliorer. Désolé je ne peux pas penser à une meilleure réponse!

+0

Oui- J'ai vérifié pour new-line. De quelle permission ai-je besoin pour vérifier? –

+0

Il suffit de jeter un coup d'œil à la spec @ http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html Je pense que vous devriez vous assurer qu'il y a une nouvelle ligne après chaque entrée, c'est dans la grammaire. – Brabster

+0

Désolé, probablement pas les autorisations. J'ai vu quelques références autour de vous dire que Tomcat ignorera les trucs de classpath déclarés dans les fichiers manifestes dans WEB-IN/lib - rien d'officiel cependant, désolé. – Brabster

0

Avez-vous essayé la dernière version de Tomcat pour voir si le problème persiste? Tomcat 6 a déjà plusieurs années, et encore moins 5.5 ou 5.0 ...

+0

Pas encore. Je suppose que je peux essayer cela et voir si le problème disparaît. Mais cela ne m'aidera pas vraiment. Mettre à jour Tomcat en ce moment n'est pas une option. –

0

Je ne crois pas que vous puissiez le faire. Tomcat ne regarde pas les manifestes JAR pour décider des problèmes CLASSPATH. Il utilise sa propre hiérarchie de chargeurs de classes pour trouver ce dont il a besoin, en utilisant CLASSPATH.

Si vous voulez des versions différentes d'un JAR pour différentes parties de votre application, vous ressemblez à une personne qui a vraiment besoin de OSGi. C'est le problème a été inventé pour résoudre.

Il existe two competing JSRs, mais je ne connais aucune implémentation pour la proposition de module Sun.

Le seul serveur d'application que je connaisse qui vous permettra de le faire est Spring's DM server. C'est une fourche de Tomcat qu'ils améliorent.