Ant: ¿Cómo arreglo una excepción WrappedRuntimeException cuando uso < xslt > ¿tarea?
Pregunta
Intenté usar la tarea xslt
en Ant para modificar un archivo de mapeo de Hibernate ( * .hbm.xml
) usando XSLT. Sin embargo, seguí obteniendo un com.sun.org.apache.xml.internal.utils.WrappedRuntimeException
.
Si saco la declaración ! DOCTYPE
en el archivo xml de origen, el siguiente objetivo se ejecuta sin ningún error. ¿Podría alguien decirme qué estoy haciendo mal? Gracias!
Aquí está mi objetivo 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>
Aquí está mi salida de registro:
[xslt] : Error! hibernate.sourceforge.net
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net
[Editar] Aquí está el DOCTYPE que eliminé para que funcione
<!DOCTYPE hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
[Edit2]: encontré una solución, pero no sé si es la " derecha " forma o no Descargué el archivo DTD y lo coloqué en el directorio de mi proyecto. Hice referencia al archivo (como se muestra a continuación) en lugar de a la URL, y parece que está funcionando ahora.
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
Solución
Ah, creo que sé el problema. En su tarea xslt
, especificó un xmlcatalog
:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
El xmlcatalog
se usa para ayudar a la tarea xslt
a encontrar DTD y otros elementos necesarios para el análisis y la validación de XML. Si va a la URL que especificó como ubicación
, obtiene un DTD. (El cual Firefox muestra una página vacía, pero al ver la fuente de la página "ver el contenido de la DTD.) Como la DTD está presente en esa URL, no sé exactamente por qué la compilación tuvo un problema al leer esa DTD. - quizás haya una diferencia en la codificación o tal vez el sitio no respondió correctamente. Si ejecutó ANT con la opción -verbose
, vería más como un volcado de pila alrededor de la falla si realmente quisiera depurarlo. Vería el Exception
original que se envolvió en el Exception
que vio.
De todos modos, si descarga la DTD en cuestión y luego apunta su ubicación
en el elemento dtd
al archivo local, como lo hizo:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
entonces el analizador puede encontrar el DTD que necesita, está garantizado y funciona bien.
Así que sí, tu solución es la solución correcta. De esta manera, sus compilaciones no dependen de que un sitio web externo sea accesible y tenga un archivo disponible.