Ant: Como faço para corrigir um WrappedRuntimeException quando se utiliza tarefa?
Pergunta
Eu tentei usar a tarefa xslt
no Ant para modificar um arquivo de mapeamento Hibernate (*.hbm.xml
) usando XSLT. No entanto eu continuei recebendo uma com.sun.org.apache.xml.internal.utils.WrappedRuntimeException
.
Se eu tirar a declaração !DOCTYPE
no arquivo xml fonte, as seguintes corridas alvo sem qualquer erro. Alguém poderia me dizer o que eu estou fazendo errado? Obrigado!
Aqui é o meu alvo 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>
Aqui está a minha saída do log:
[xslt] : Error! hibernate.sourceforge.net
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net
[Edit] Aqui está o DOCTYPE que eu removido para fazê-lo funcionar
<!DOCTYPE hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
[Edit2]: Eu encontrei uma solução, mas eu não sei se se é o caminho "certo" ou não. Eu baixei o arquivo DTD e colocou isso no meu dir projeto. Eu referenciado o arquivo (como mostrado abaixo) em vez da URL, e parece estar trabalhando agora.
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
Solução
Ah, eu acho que sei o problema. Em sua tarefa xslt
, você especificou uma xmlcatalog
:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
O xmlcatalog
é usado para ajudar os DTDs Encontra-tarefa xslt
e outros itens necessários para análise XML e validação. Se você vai para o URL especificado como location
você receber um DTD. (Mostra quais Firefox um uma página vazia, mas a visualização "fonte da página" você verá o conteúdo DTD.) Desde o DTD é de fato presente na URL, eu não sei exatamente por que a construção teve uma leitura de problema que DTD - talvez haja uma diferença na codificação ou talvez o site não respondeu corretamente. Se você executou ANT com a opção -verbose
, você veria mais de um despejo de pilha em torno do fracasso se você realmente queria depurá-lo. Você iria ver o Exception
original que ficou envolto na Exception
você viu.
De qualquer forma, se você baixar o DTD em questão e, em seguida, apontar o seu location
no elemento dtd
no arquivo local, como você fez:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
, em seguida, o analisador pode encontrar o DTD que precisa, garantida, e funciona bem.
Então, sim, a sua solução é a solução correta. Desta forma, seu constrói não dependem de um site externo a ser acessível e ter um arquivo disponível.