Ant: ¿Cómo arreglo una excepción WrappedRuntimeException cuando uso < xslt > ¿tarea?

StackOverflow https://stackoverflow.com/questions/612965

  •  03-07-2019
  •  | 
  •  

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> 
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top