Ant: Comment corriger une exception WrappedRuntimeException avec < xslt > tâche?
Question
J'ai essayé d'utiliser la tâche xslt
dans Ant pour modifier un fichier de mappage Hibernate ( *. hbm.xml
) à l'aide de XSLT. Cependant, j'ai continué à obtenir un com.sun.org.apache.xml.internal.utils.WrappedRuntimeException
.
Si je retire la déclaration ! DOCTYPE
dans le fichier XML source, la cible suivante s'exécute sans erreur. Est-ce que quelqu'un pourrait me dire ce que je fais mal? Merci!
Voici ma cible Ant:
<target name="generatePermHbmXml">
<xslt in="${base.configuration.hibernate.dir}\Test.hbm.xml"
out="${base.configuration.hibernate.dir}\TestPerm.hbm.xml"
style="${base.configuration.hibernate.dir}\perm.xsl">
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
</xslt>
</target>
Voici la sortie de mon journal:
[xslt] : Error! hibernate.sourceforge.net
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net
[Modifier] Voici le DOCTYPE que j'ai enlevé pour le faire fonctionner
<!DOCTYPE hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
[Edit2]: J'ai trouvé un correctif, mais je ne sais pas si c'est le "droit" chemin ou pas. J'ai téléchargé le fichier DTD et l'ai placé dans mon répertoire de projet. J'ai référencé le fichier (comme indiqué ci-dessous) au lieu de l'URL, et il semble fonctionner maintenant.
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
La solution
Ah, je pense connaître le problème. Dans votre tâche xslt
, vous avez spécifié un xmlcatalog
:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
Le xmlcatalog
est utilisé pour aider la tâche xslt
à trouver les DTD et autres éléments nécessaires à l'analyse et à la validation XML. Si vous accédez à l'URL que vous avez spécifiée comme emplacement
, vous obtenez une DTD. (Firefox affiche une page vide, mais vous voyez le contenu de la DTD en affichant "source de page".) La DTD étant en fait présente à cette adresse URL, je ne sais pas exactement pourquoi la construction a eu un problème de lecture de cette DTD - - Peut-être qu'il y a une différence d'encodage ou que le site n'a pas répondu correctement. Si vous exécutiez ANT avec l'option -verbose
, vous verriez davantage de dump de pile autour de l'échec si vous souhaitiez vraiment le déboguer. Vous verriez le Exception
d'origine enveloppé dans le Exception
que vous avez vu.
Quoi qu'il en soit, si vous téléchargez la DTD en question, puis pointez votre emplacement
dans l'élément dtd
du fichier local, comme vous l'avez fait:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
alors l'analyseur peut trouver la DTD dont il a besoin, garanti, et cela fonctionne bien.
Alors oui, votre solution est la bonne. Ainsi, vos versions ne dépendent pas de la disponibilité d’un site Web externe et de la disponibilité d’un fichier.