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

时间:2009-03-04 23:25:53

标签: hibernate xslt ant build

我尝试使用Ant中的xslt任务来使用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> 

1 个答案:

答案 0 :(得分:2)

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

<xmlcatalog>
  <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
       location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>

xmlcatalog用于帮助xslt任务查找XML解析和验证所需的DTD和其他项目。如果您转到指定为location的URL,则会获得DTD。 (哪个Firefox显示一个空页面,但查看“页面源”,你会看到DTD内容。)由于DTD实际上存在于该URL,我不知道为什么构建在读取DTD时出现问题 - 也许在编码方面存在差异,或者网站可能没有正确响应。如果您使用-verbose选项运行ANT,如果您真的想要调试它,您会看到更多的堆栈转储。您会看到原始的Exception被包裹在您看到的Exception中。

无论如何,如果您下载有问题的DTD,然后将location中的dtd指向本地文件,就像您一样:

<xmlcatalog>
  <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
       location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>

然后解析器可以找到它需要的DTD,保证,并且它工作正常。

是的,您的解决方案是正确的解决方案。这样,您的构建不依赖于可访问的外部网站并且可以使用文件。