2009-03-04 10 views
0

Ich habe versucht, die xslt Aufgabe in Ant zu verwenden, um eine Hibernate Mapping-Datei (*.hbm.xml) mit XSLT zu ändern. Aber ich bekam immer eine .Ant: Wie behebe ich eine WrappedRuntimeException bei der Verwendung von <xslt> Aufgabe?

Wenn ich die !DOCTYPE Deklaration in der Quell-XML-Datei herausnehmen, wird das folgende Ziel ohne Fehler ausgeführt. Könnte mir bitte jemand sagen, was ich falsch mache? Vielen Dank!

Hier ist meine Ant-Ziel:

<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> 

Hier ist meine Log-Ausgabe:

[xslt] : Error! hibernate.sourceforge.net 
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net 

[Bearbeiten] Hier ist die DOCTYPE, dass ich es

<!DOCTYPE hibernate-mapping 
PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

[Edit2 zu erhalten entfernt arbeiten ]: Ich habe eine Lösung gefunden, aber ich weiß nicht, ob es der "richtige" Weg ist oder nicht. Ich habe die DTD-Datei heruntergeladen und in mein Projektverzeichnis eingefügt. Ich habe die Datei (wie unten gezeigt) anstelle der URL referenziert, und es scheint jetzt zu funktionieren.

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

Also was ist die DOCTYPE-Deklaration was, wenn Sie es entfernen Dinge funktionieren? – Eddie

+0

wie im obigen Beitrag hinzugefügt, denke ich, dass es eine Standard-Hibernate-DTD war, die ich von der Hibernate-Site genommen habe. – tomato

Antwort

2

Ah, ich denke, ich kenne das Problem. In Ihrer xslt Aufgabe haben, haben Sie eine xmlcatalog:

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

Die xmlcatalog verwendet die xslt Aufgabe DTDs zu finden und für XML-Parsing und Validierung benötigt andere Elemente zu helfen. Wenn Sie zu der URL gehen, die Sie als location angegeben haben, erhalten Sie eine DTD. (Welcher Firefox eine leere Seite anzeigt, aber "Seitenquelle" anzeigt, sehen Sie den Inhalt der DTD.) Da die DTD tatsächlich bei dieser URL vorhanden ist, weiß ich nicht genau, warum der Build beim Lesen dieser DTD ein Problem hatte - vielleicht gibt es einen Unterschied in der Kodierung oder vielleicht hat die Seite nicht richtig reagiert. Wenn Sie ANT mit der Option -verbose ausführen, würden Sie einen Stack-Dump um den Fehler sehen, wenn Sie ihn wirklich debuggen möchten. Sie würden das Original Exception sehen, das in die Exception eingewickelt wurde, die Sie sahen. Wie dem auch sei

, wenn Sie die DTD in Frage herunterladen und dann zeigen Sie Ihre location im dtd Element auf der lokalen Datei, wie Sie getan haben:

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

dann der Parser die DTD finden es braucht, die garantiert, und es funktioniert gut.

Also ja, Ihre Lösung ist die richtige Lösung. Auf diese Weise sind Ihre Builds nicht davon abhängig, dass eine externe Website zugänglich ist und eine Datei verfügbar ist.

Verwandte Themen