2010-06-08 3 views
30

J'ai un simple projet java maven. Une de mes classes lors de l'exécution doit charger un fichier de configuration xml à partir du classpath. Je ne veux pas empaqueter un tel fichier XML lors de la production du fichier jar, mais je veux inclure un fichier xml par défaut dans un assemblage zip sous un sous-dossier conf et je veux également que ce xml soit disponible dans les tests unitaires pour le tester.Où dans le chemin du projet maven dois-je mettre les fichiers de configuration qui ne sont pas considérés comme des ressources

Comme je le vois, il y a 2 places possibles de ce xml par défaut:

  1. src/main/resources/conf/default.xml
  2. src/main/conf/default.xml

Les deux solutions exigent des actions pom spéciales:

  • En solution 1, je reçois la copie automatique dans le dossier cible pendant b uild ce qui signifie qu'il est disponible dans les tests mais je l'obtiens aussi dans le pot produit que je ne veux pas.

  • Dans la solution 2, j'obtiens le pot comme je le veux (sans le xml) mais je dois manuellement copier le xml dans le dossier cible pour être disponible pour le test. (Je ne veux pas ajouter les sous-dossiers de src dans le classpath de test, je pense que c'est une mauvaise pratique).

Question: quelle est la meilleure solution des deux?
- Si la valeur correcte est 2, quel est le meilleur moyen de le copier dans le dossier cible?
- Existe-t-il une autre solution meilleure et plus commune que ces deux solutions? (Je lis aussi Where should I put application configuration files for a Maven project? mais je voudrais savoir la solution la plus correcte du point de vue de la "convention sur la configuration" et ce lien fournit quelques solutions de type configuration mais pas de convention. mais les solutions fournies incluent le plugin AntRun et le plugin appAssembler et je me demande si je pourrais le faire sans eux.)

Répondre

37

La question est quelle est la meilleure solution des deux? Si la valeur correcte est 2, quel est le meilleur moyen de le copier dans le dossier cible? Y a-t-il une autre solution meilleure et plus commune que ces deux-là?

Puisque vous voulez que le fichier à copier dans le dossier target/classes, il a en quelque sorte à être considéré comme une ressource (donc soit mis en sous src/main/resources ou déclarer src/main/conf comme répertoire des ressources).Et si vous ne voulez pas dans le pot finale, configurez le Maven JAR Plugin pour exclure:

<project> 
    ... 
    <build> 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <configuration> 
      <excludes> 
      <exclude>**/conf/*</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 
    ... 
</project> 

Pour la pièce d'assemblage, les descripteurs d'assemblage sont assez souples il devrait donc être possible d'obtenir ce que vous voulez quelle que soit la choix. Je suggère d'utiliser l'installation la plus simple cependant.

+1

oblèmes avec les deux solutions: 1./déclarer 'conf' comme une ressource l'inclut toujours dans le pot, et ne nous laisse aucun moyen facile d'exclure; 2./créer 'conf' à l'intérieur des ressources, et l'exclure dans le plugin l'amène à ne pas être à la racine du chemin de la classe. – YoYo

+0

pour une raison quelconque c'est une des quelques réponses utiles en général pour "comment exclure quelque chose de maven jar" quand googling ... même s'il ne répond pas OP exactement, c'est toujours un bon exemple d'utilisation de 'maven-jar -plugin' – mmcrae

1

Vous pouvez le placer dans src/test/conf/default.xml. Vos testclasses peuvent le trouver, mais il ne sera pas emballé en utilisant la méthode standard.

Avec un assemblage supplémentaire, vous pouvez l'emballer à partir de là. Cette étape est toujours nécessaire.

Une solution différente pourrait être de créer un module maven séparé et de le placer dans/src/main/resources/conf/... .Puis faire de ce jar une dépendance de test. Vous n'avez pas besoin de faire une configuration de plugin spéciale, mais je pense que c'est trop compliqué pour un seul fichier.

+0

la chose que je ne aime pas avec cette solution est que l'ensemble produisant le zip devra obtenir de src/test/conf et ce xml n'est pas seulement un fichier de test, je suppose que la solution que vous proposez est la même si je la place dans src/main/conf? De là, elle est également visible pour les tests du dossier target/classes au lieu de target/test- Est-il incorrect de faire des tests qui obtiennent des données de target/classes ou doivent-ils dépendre uniquement des classes cibles/test? – Paralife

1

Ma solution était d'utiliser deux profils: le développement (par défaut) et l'emballage

Mon défaut/section contient à la fois src/main/ressources et src/main/conf. J'appelle cela mon profil de développement, qui est un profil implicite.

Mon profil d'empaquetage est un profil explicite qui est défini dans la section. Là-dessous/j'ai seulement mentionné src/main/resources. Quand j'utilise mon script de packaging (nous avons actuellement un external pour maven depuis la création d'un RPM depuis notre WAR), je lance 'mvn install -Drpm' pour activer mon profil Packaging (rpm est l'ID de l'emballage) le profil.

Si cela ne suffisait pas claire, ne hésitez pas à poser plus de questions.

Questions connexes