Pfad zur XML-DTD für DBUnit im Java / Maven-Projekt mit mehreren Modulen?

8

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?

    
HDave 10.06.2010, 19:37
quelle

5 Antworten

8

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.

    
HDave 13.06.2010, 02:46
quelle
3

Verwenden Sie immer die richtigen Variablen, um auf spezielle Verzeichnisse zuzugreifen, da Multi-Modul-Builds ein anderes Arbeitsverzeichnis haben als lokale Builds:

Also

  • anstelle von mydir verwenden ${project.basedir}/mydir
  • anstelle von target/mydir verwenden ${project.build.directory}/mydir
  • anstelle von 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.

    
Sean Patrick Floyd 11.06.2010 07:34
quelle
1

Sie könnten die DTD auf einem Webserver veröffentlichen und dann ihre HTTP-URL in den DOCTYPE eingeben, z. B .:

%Vor%     
Andrew Swan 18.09.2013 00:32
quelle
0

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.

    
dmitrijs 15.02.2012 19:24
quelle
0

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 .

    
Andrew Swan 18.09.2013 00:34
quelle

Tags und Links