我尝试使用Ant中的xslt任务来修改Hibernate映射文件(*.hbm.xml)。然而,我一直在买一台com.sun.org.apache.xml.internal.utils.WrappedRuntimeException。
如果我去掉源xml文件中的!DOCTYPE声明,则以下目标运行时没有任何错误。有人能告诉我我哪里做错了吗?谢谢!
这是我的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>以下是我的日志输出:
[xslt] : Error! hibernate.sourceforge.net
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net编辑这里是我为使其正常工作而删除的DOCTYPE
<!DOCTYPE hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">Edit2:我找到了一个解决方法,但我不知道这是不是“正确”的方法。我下载了DTD文件并将其放入我的项目目录中。我引用了文件(如下所示)而不是URL,现在它似乎可以工作了。
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog> 发布于 2009-03-05 00:55:04
啊,我想我知道问题出在哪了。在xslt任务中,您指定了一个xmlcatalog
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>xmlcatalog用于帮助xslt任务查找解析和验证所需的DTD和其他项。如果转到指定为location的URL,就会得到一个DTD。( Firefox显示的是一个空页面,但查看“页面源代码”时会看到DTD内容。)由于DTD实际上存在于该URL中,我不知道为什么构建在读取该DTD时会出现问题--可能是编码不同,也可能是站点没有正确响应。如果您使用-verbose选项运行ANT,那么如果您真的想调试它,您将看到更多关于故障的堆栈转储。您将看到包装在所看到的Exception中的原始Exception。
无论如何,如果您下载了有问题的DTD,然后将dtd元素中的location指向本地文件,就像您所做的那样:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>然后解析器可以找到它所需要的DTD,这是有保证的,并且它工作得很好。
所以,是的,您的解决方案是正确的解决方案。通过这种方式,您的构建不依赖于外部网站是否可访问以及文件是否可用。
https://stackoverflow.com/questions/612965
复制相似问题