Ant: Wie behebe ich einen WrappedRuntimeException bei der Verwendung von Aufgabe?
Frage
Ich habe versucht, die xslt
Aufgabe in Ant zu verwenden, um eine Hibernate Mapping-Datei (*.hbm.xml
) mit XSLT zu ändern. Allerdings hielt ich auf eine com.sun.org.apache.xml.internal.utils.WrappedRuntimeException
bekommen.
Wenn ich die !DOCTYPE
Deklaration in der XML-Quelldatei nehmen, läuft das folgende Ziel ohne Fehler. Könnte mir bitte jemand sagen, was mache ich falsch? Dank!
Hier ist mein 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, die ich entfernt, um es arbeiten
<!DOCTYPE hibernate-mapping
PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
[Edit2]: Ich habe eine fix gefunden, aber ich weiß nicht, ob, wenn es der „richtige“ Weg ist oder nicht. Ich habe die DTD-Datei und platziert, dass in meinem Projekt Richt. I verweisen die Datei (wie unten dargestellt) anstelle der URL, 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>
Lösung
Ach, ich glaube, 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
wird verwendet, die xslt
Aufgabe benötigt DTDs und andere Elemente für XML-Parsing und Validierung finden zu helfen. Wenn Sie die URL gehen Sie wie location
angegeben Sie tun, um eine DTD erhalten. (Welche Firefox zeigt eine eine leere Seite, aber viewing „Seitenquelle“ können Sie die DTD Inhalte zu sehen.) Da die DTD in der Tat vorhanden ist, zu dieser URL, ich nicht genau wissen, warum die Build ein Problem hatte, dass die DTD zu lesen - vielleicht gibt es einen Unterschied in der Codierung oder vielleicht hat die Website nicht richtig reagieren. Wenn Sie ANT mit der -verbose
Option laufen, würden Sie eher ein Stapelabbild um den Fehler sehen, wenn Sie es wirklich debuggen wollen. Sie würden die ursprünglichen Exception
, die in dem Exception
gewickelt habe Sie gesehen haben.
Wie auch immer, wenn Sie die DTD in Frage herunterladen und dann location
im dtd
Elemente auf der lokalen Datei zeigen, wie Sie getan haben:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
dann kann der Parser finden die DTD es braucht, garantiert, und es funktioniert gut.
Also ja, Ihre Lösung ist die richtige Lösung. Auf diese Weise Ihr baut auf einer externen Website hängen nicht zugänglich ist und eine Datei zur Verfügung.