Ich habe ein Multi-Modul-Maven-Projekt. Innerhalb des persistenten Moduls habe ich eine Anzahl von XML-Dateien, die auf eine DTD verweisen:
%Vor%Die DTD wird im selben Verzeichnis wie die XML-Dateien gespeichert und selbst Eclipse meldet diese XML-Dateien als gültig.
Wenn ich die Anwendung ausführe, löst DBUnit FlatXMLDataSet jedoch eine FileNotFound-Ausnahme aus, da die DTD nicht gefunden werden kann. Es sucht offensichtlich nach der DTD im Stammprojektverzeichnis (z. B. myproject /). Ich hätte erwartet, dass die DTD im selben Verzeichnis wie die XML-Datei selbst gesucht wird (z. B. myproject / persist / target / test-data).
Betrachtet man den DBUnit-Quellcode, sagt er Folgendes: "Relative DOCTYPE uri werden aus dem aktuellen Arbeitsverzeichnis gelöst."
Was ist ein guter Weg, um das zu beheben?
OK, ich denke, ich habe das herausgefunden. Gott sei Dank für Open Source.
Es gibt eine Methode für FlatXmlDataSetBuilder, die einen Stream zur DTD führt. Es ist verrückt, dass dies eine öffentliche Methode IMO ist, aber wiederum ist es verrückt, dass DBUnit nicht im selben Verzeichnis wie das XML für die dtd-Datei aussieht. Also hier ist es:
%Vor%Jetzt belasse ich die DOCTYPE-Deklaration mit der dtd im selben Verzeichnis wie die XML und benutze diesen Hack, um DBUnit dazu zu bringen, das Richtige zu tun.
Verwenden Sie immer die richtigen Variablen, um auf spezielle Verzeichnisse zuzugreifen, da Multi-Modul-Builds ein anderes Arbeitsverzeichnis haben als lokale Builds:
Also
mydir
verwenden ${project.basedir}/mydir
target/mydir
verwenden ${project.build.directory}/mydir
target/classes/mydir
verwenden ${project.build.outputDirectory}/mydir
Diese Variablen werden immer zum aktuellen Projekt ausgewertet, unabhängig davon, wo es aufgerufen wird. Hier ist eine Übersicht über POM-Variablen (nicht vollständig, aber das Wichtigste ist drin)
Wenn Sie auch interaktives Debug-Debugging durchführen möchten, können Sie die Hilfe verwenden : evaluieren mojo ist praktisch:
rufen Sie einfach
an %Vor% und Sie werden nach einem Ausdruck gefragt. Wenn Sie einen Ausdruck eingeben, z. ${project.build.plugins[0]}
, das zusammengeführte Dom für das angegebene Element wird aufgelistet
BEARBEITEN:
Ok, jetzt denke ich, ich sehe das Problem. Warum referenziere dann nicht einfach das Verzeichnis in der xml:
%Vor%Ich weiß, es ist nicht schön, aber es sollte funktionieren, Multi-Modul oder nicht. Das aktuelle Verzeichnis für Komponententests ist immer das aktuelle $ {project.basedir}, nicht das übergeordnete Projektverzeichnis.
Sie könnten die DTD auf einem Webserver veröffentlichen und dann ihre HTTP-URL in den DOCTYPE eingeben, z. B .:
%Vor%Versuchen Sie, beim Öffnen einer XML-Datei "File" anstelle von "FileInputStream" zu verwenden.
Zum Beispiel:
%Vor%Auf diese Weise sollte der relative Pfad zur DTD mit dem Verzeichnis der XML-Datei beginnen.
Und wenn Sie
verwenden %Vor%Pfad sollte relativ zum aktuellen Arbeitsverzeichnis sein.
Es beinhaltet einige hässliche Duplikate, aber Sie könnten den Inhalt der DTD in die betreffende (n) XML-Datei (en) einfügen und sie dann als Interne DTDs .