Erreur lors insertion class dans fichier jar shared/lib

cancel
Showing results for 
Search instead for 
Did you mean: 
joreun
Active Member

Erreur lors insertion class dans fichier jar shared/lib

Bonjour,
Je tente le déploiement de mes extensions (repository+share) en utilisant la méthode à priori conseillée d'un fichier jar sous tomcat/shared/lib/mon-extension.jar.
L'ensemble des fichiers de configuration (xml, js, ftl…) sous alfresco/extension et alfresco/web-extension sont bien pris en compte.

Cependant, je rencontre l'erreur suivante au chargement tomcat concernant la prise en compte des classes associées à un bean lorsqu'elles sont ajoutées dans WEB-INF/classes de ce jar :
19:55:52,832  ERROR [web.context.ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jmxUrl' defined in class path resource [alfresco/core-services-context.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final java.lang.String $Proxy4.subsituteHost(java.lang.String)] threw exception; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.alfresco.repo.content.transform.Xml2HtmlParserContentTransformer] for bean with name 'transformer.XmlParser' defined in URL [jar:file:/home/alfuser/alfresco-3.4.0/tomcat/shared/lib/mon-extension.jar!/alfresco/extension/xmlparser-transformer-context.xml]; nested exception is java.lang.ClassNotFoundException: org.alfresco.repo.content.transform.Xml2HtmlParserContentTransformer
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'LuceneFullTextSearchIndexer' defined in class path resource [alfresco/core-services-context.xml]: Cannot resolve reference to bean 'luceneFullTextSearchIndexer' while setting bean property 'target'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'luceneFullTextSearchIndexer' defined in class path resource [alfresco/core-services-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.alfresco.repo.content.transform.Xml2HtmlParserContentTransformer] for bean with name 'transformer.XmlParser' defined in URL [jar:file:/home/alfuser/alfresco-3.4.0/tomcat/shared/lib/mon-extension.jar!/alfresco/extension/xmlparser-transformer-context.xml]; nested exception is java.lang.ClassNotFoundException: org.alfresco.repo.content.transform.Xml2HtmlParserContentTransformer

Lorsque les fichiers classes associées à mon bean Xml2HtmlParserContentTransformer sont ajoutées sous webapps/alfresco/WEB-INF/classes, il n'y a aucune erreur et l'application fonctionne correctement. Mais je ne souhaite pas avoir à déployer sous webapps/alfresco.

Aurai-je fait une erreur de configuration ou se peut-il qu'il y ait un bug dans le mécanisme de surcharge par jar ?
Merci.
7 Replies
rguinot
Customer

Re: Erreur lors insertion class dans fichier jar shared/lib

Les classes ne doivent pas etre dans WEB-INF/lib d'un jar.
Le jar doit uniquement reproduire l'arborescence (les . deviennent des /), et posséder un META-INF.

Voir :

man jar

Preter également attention  :
- au fait que si votre classe possède des inner classes, elles doivent aussi être dans le jar.
-  à l'arbre des classloaders et au dépendances introduites par l'ordre de chargement.
joreun
Active Member

Re: Erreur lors insertion class dans fichier jar shared/lib

Bonjour,
Pour une meilleure compréhension, voici le contenu de mon jar (avant zippage) :

\alfresco\extension\…
\alfresco\messages\…
\alfresco\web-extension\…
\META-INF\components\…
\WEB-INF\classes\org\alfresco\repo\content\transform\Xml2HtmlParserContentTransformer$1.class
\WEB-INF\classes\org\alfresco\repo\content\transform\Xml2HtmlParserContentTransformer.class
\WEB-INF\classes\org\alfresco\repo\content\transform\Xml2HtmlParserContentTransformerTest.class

Les classes sont donc bien dans WEB-INF/classes du jar.
Le jar étant positionné dans tomcat/shared/lib, celui-ci est à priori chargé dans les derniers (après webapp/alfresco/WEB-INF/classes et webapp/alfresco/WEB-INF/lib d'après

Des idées sur le non fonctionnement ?
Quelqu'un a-t-il déjà réussi à déployer des classes d'extensions dans des jar ?
rguinot
Customer

Re: Erreur lors insertion class dans fichier jar shared/lib

comme je vous ai dit tout a l'heure, votre jar ne doit pas contenir de repertoire WEB-INF/classes. vous devez avoir directement un repertoire org, puis un répertoire alfresco, … à la racine du jar zippé et au bout de l'arborescence vos classes.

En outre, le lien que vous mentionnez concerne tomcat 5.5. Je suppose que vous tournez sur un tomcat 6.
joreun
Active Member

Re: Erreur lors insertion class dans fichier jar shared/lib

Effectivement, WEB-INF/classes n'a rien à faire dans un jar.
Je reteste sans.
joreun
Active Member

Re: Erreur lors insertion class dans fichier jar shared/lib

Sans WEB-INF/classes dans le jar, ma classe semble etre bien reconnue, cependant, c'est maintenant une autre classe qui n'est pas trouvée :

21:04:28,182  ERROR [web.context.ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jmxUrl' defined in class path resource [alfresco/core-services-context.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final java.lang.String $Proxy4.subsituteHost(java.lang.String)] threw exception; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.alfresco.repo.content.transform.Xml2HtmlParserContentTransformer] for bean with name 'transformer.XmlParser' defined in URL [jar:file:/home/alfuser/alfresco-3.4.0/tomcat/shared/lib/share-Michelin.jar!/alfresco/extension/xmlparser-transformer-context.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/alfresco/repo/content/transform/AbstractContentTransformer2
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'LuceneFullTextSearchIndexer' defined in class path resource [alfresco/core-services-context.xml]: Cannot resolve reference to bean 'luceneFullTextSearchIndexer' while setting bean property 'target'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'luceneFullTextSearchIndexer' defined in class path resource [alfresco/core-services-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.alfresco.repo.content.transform.Xml2HtmlParserContentTransformer] for bean with name 'transformer.XmlParser' defined in URL [jar:file:/home/alfuser/alfresco-3.4.0/tomcat/shared/lib/share-Michelin.jar!/alfresco/extension/xmlparser-transformer-context.xml]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: org/alfresco/repo/content/transform/AbstractContentTransformer2

Encore une fois, ce problème n'apparait pas si les 3 fichiers .class de mon extension sont déployées sous webapps/alfresco/WEB-INF/classes.
Des idées ?
rguinot
Customer

Re: Erreur lors insertion class dans fichier jar shared/lib

Preter également attention :
- au fait que si votre classe possède des inner classes, elles doivent aussi être dans le jar.
- à l'arbre des classloaders et au dépendances introduites par l'ordre de chargement.

Le point 2 contient la réponse. le modèle de classloading est, par défaut, delegation au parent.
Peut etre que dans votre cas un AMP sera + approprié.
joreun
Active Member

Re: Erreur lors insertion class dans fichier jar shared/lib

Merci.
Effectivement, problème d'ordre de chargement des classes.
J'en conclue que pour étendre Alfresco l'on ne peut pas tout faire par le mécanisme de fichier jar dans shared/lib.
Je voulais à tout prix me passer de AMP qui nécessite de surcharger webapps mais apparemment c'est le seul moyen.