首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ant:如何在使用<xslt>任务时修复WrappedRuntimeException?

Ant:如何在使用<xslt>任务时修复WrappedRuntimeException?
EN

Stack Overflow用户
提问于 2009-03-04 23:25:53
回答 1查看 1.9K关注 0票数 0

我尝试使用Ant中的xslt任务来修改Hibernate映射文件(*.hbm.xml)。然而,我一直在买一台com.sun.org.apache.xml.internal.utils.WrappedRuntimeException

如果我去掉源xml文件中的!DOCTYPE声明,则以下目标运行时没有任何错误。有人能告诉我我哪里做错了吗?谢谢!

这是我的Ant目标:

代码语言:javascript
复制
<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>

以下是我的日志输出:

代码语言:javascript
复制
[xslt] : Error! hibernate.sourceforge.net
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net

编辑这里是我为使其正常工作而删除的DOCTYPE

代码语言:javascript
复制
<!DOCTYPE hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

Edit2:我找到了一个解决方法,但我不知道这是不是“正确”的方法。我下载了DTD文件并将其放入我的项目目录中。我引用了文件(如下所示)而不是URL,现在它似乎可以工作了。

代码语言:javascript
复制
<xmlcatalog>
  <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
       location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog> 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-03-05 00:55:04

啊,我想我知道问题出在哪了。在xslt任务中,您指定了一个xmlcatalog

代码语言:javascript
复制
<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指向本地文件,就像您所做的那样:

代码语言:javascript
复制
<xmlcatalog>
  <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
       location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>

然后解析器可以找到它所需要的DTD,这是有保证的,并且它工作得很好。

所以,是的,您的解决方案是正确的解决方案。通过这种方式,您的构建不依赖于外部网站是否可访问以及文件是否可用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/612965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档