9
votes

Path to XML DTD pour DBUnit dans le projet multicouille Java / Maven?

J'ai un projet multicouille Maven Maven. Dans le module persist, j'ai plusieurs fichiers de fichiers XML qui font référence à une DTD:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myapp-data SYSTEM "myapp-data.dtd" >

<dataset>
      .....omitted for brevity....
</dataset>


0 commentaires

5 Réponses :


3
votes

Utilisez toujours les variables correctes pour accéder aux répertoires spéciaux, car les bâtiments multi-modules ont un répertoire de travail différent de celui des bâtiments locaux:

SO P>

  • au lieu de mydir code> Utilisez $ {projet.basedir} / mydir code> li>
  • au lieu de cible / myDir code> Utilisez $ {projet.build.directory} / mydir code> li>
  • au lieu de cible / classes / mydir code> Utilisez $ {project.build.outputdirectory} / mydir code> li> ul>

    Ces variables évaluent toujours au projet en cours, peu importe où il est appelé. Voici un Vue d'ensemble des variables POM (pas complète mais les trucs les plus importants sont là ) p>

    En outre, si vous voulez déjà faire du débogage interactif de type requérant, le Aide: Évaluer Mojo est utile à portée de main: p>

    Appelez simplement P>

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE myapp-data SYSTEM "target/test-classes/myapp-data.dtd" >
    


3 commentaires

Je ne pense pas que le problème soit avec Maven, c'est avec Dbunit. Sa recherche au mauvais endroit pour la DTD. Y a-t-il un autre meilleur moyen de spécifier que dans le fichier XML? Y a-t-il un cadre dbunit que je manque?


Faire la nouvelle approche résout le problème d'exécution, mais maintenant Eclipse se plaint de ne pas localiser la DTD pour validation. Je veux avoir mon gâteau et manger aussi !!


Le répertoire "cible" n'existe qu'après une construction maven. Si j'exécute Mvn propre, il n'est pas là, puis Eclipse remonte à se plaindre! J'ai examiné le code source à dbunit et ils sortent vraiment de leur chemin pour ne pas trouver la DTD ....



9
votes

OK, je pense que je pensais celui-ci. Merci bonté pour Open Source.

Il existe une méthode sur FlatXMLDAtaSetBuilder qui prend un flux à la DTD. C'est fou que c'est une méthode publique imo, mais encore une fois, son fou que dbunit ne regarde pas dans le même répertoire que le XML pour le fichier DTD. Voici donc: P>

String dtdResourceName = "classpath:test-data/myapp-data.dtd";      
Resource res = applicationContext.getResource(dtdResourceName);
builder.setMetaDataSetFromDtd(res.getInputStream());


2 commentaires

Quelle version utilisez-vous? Je ne trouve pas ce code ici: dbunit.sourceforge.net / XREF / ORG / DBUNIT / DataSet / XML / ...


C'est dans le lien que vous avez fourni ... Check Line 195 - difficile à trouver en fait. dbunit.sourceforge.net/xref/org/dbunit/ DataSet / XML / ...



0
votes

Essayez d'utiliser "Fichier" au lieu de "FileInputStream" lors de l'ouverture d'un fichier XML.

Par exemple: P>

ReplacementDataSet dataSet = new ReplacementDataSet(new FlatXmlDataSet(new FileInputStream(fileName)));


0 commentaires

1
votes

Vous pouvez publier la DTD sur un serveur Web, puis mettre son URL HTTP dans le DOCTYPE, E.G.:

<!DOCTYPE myapp-data SYSTEM "-//The Owner//The Description//EN" "http://host/path/to/myapp-data.dtd">


0 commentaires

0
votes

Cela implique une duplication laideuse, mais vous pouvez coller le contenu de la DTD dans le ou les fichiers XML en question, puis utilisez-les comme DTDS interne .


0 commentaires