Conventions de nommage Maven pour les projets à modules multiples hiérarchiques

j'ai une question sur les conventions de nommage Maven (groupId, artifactId et noms de répertoires) dans un projet à modules multiples avec une structure hiérarchique de répertoires.

recherche

avant de demander, j'ai parcouru d'autres le web sur ce sujet et ce que j'ai dégagé pour moi-même:

  1. duplication Possible pour ma question, mais elle ne couvre pas les niveaux hiérarchiques multiples.

  2. le nom du répertoire du projet DOIT CORRESPONDRE artificatId .

  3. Guide sur les Conventions de Nommage donner des exemples:

    • groupId identifiera votre projet de manière unique à travers tous les projets, donc nous avons besoin d'appliquer un schéma de nommage. Il doit suivre les règles de nom de paquet (par ex. org.Apache.maven, org.Apache.communes, org.Apache.maven.plugins)

    • artifactId si vous l'avez créé, vous pouvez choisir n'importe quel nom que vous voulez avec des lettres minuscules et aucun symbole étrange. (eg. maven, communes-mathématiques)

c'est assez simple et je le comprends, mais il y a peu de choses qui ne sont pas encore claires.

artifactId les exemples mentionnés dans les conventions ne peuvent être appliqués qu'au module de hiérarchie à un niveau.

exemples

j'ai parcouru les dépôts maven et extrait quelques exemples:

Printemps utilise principalement les noms: ressort-core, printemps-contexte, printemps-cadre-support. Tous les modules autonomes sont une hiérarchie à un niveau et un préfixe de ressort pour l'efficacité de la recherche. Il n'y a pas problèmes, puisque la hiérarchie n'est pas si profonde.

Apache CXF les appellations sont assez peu conventionnelles pour Apache. Les artéfacts sont des modules autonomes avec jusqu'à 5 artéfacts différents possibles dans les noms par exemple. cxf-outils-wsdlto-liaison de données-jaxb.

il existe de nombreux artefacts (cxf-rt-databinding-jaxb, cxf-rt-databinding-aegis, cxf-rt-databinding-xmlbeans, cxf-rt-databinding-sdo) qui pourraient être regroupés dans le projet à modules multiples (cxf-rt-databindings), mais ils ne l'ont pas fait et les noms sont devenus spaghetti.

enfin, Maven Plugins est d'abord un projet à modules multiples (après org.Apache.maven) qui a des artefacts comme: maven-compilateur-plugin, maven-enforcer-plugin.

il y a beaucoup d'exemples et les tous suivent différentes conventions sur la dénomination des artifactIds (par conséquent les répertoires de projet).

Résultat

à partir des meilleures pratiques des exemples, examinons les niveaux hiérarchiques.

Un niveau de la hiérarchie de nommage (

groupId:    org.organization.project
artifactId: project-portal ---.
                              |
                              project-portal-service
                              |
                              project-portal-plugins (continued on next diagram)
                              |
                              project-portal-util

(suite) hiérarchie à deux niveaux:

groupId:    org.organization.project.plugins
artifactId: project-portal-plugins ---.
                                      |
                                      project-sample-plugin
                                      |
                                      project-another-great-plugin
                                      |
                                      ???? (multiple module project)

Vous voyez des points d'interrogation? C'est là que le

Questions

j'ai suivi les conventions des exemples (ignoring spaghetti Apache CXF example):

  • à la Racine du projet de portail (par exemple. printemps-core, maven-core)
  • les noms de hiérarchie de premier niveau héritent de root - project-portal-plugins (par ex. printemps-cadre-support).
  • de Second niveau de la hiérarchie des noms de projet-exemple-plugin (par exemple. maven-compiler-plugin).

et maintenant nous sommes coincés au troisième niveau, comme dans les vieux jeux sans arrêts et points de contrôle.

  1. est-ce le chemin de nommage du répertoire de droite pris à partir D'exemples Maven pour des niveaux de hiérarchie plus profonds?
  2. y a-t-il des conventions ou des règles que vous suivez pour supporter les noms de répertoire simples et d'artefacts en évitant les noms de spaghetti sur des niveaux plus profonds?
  3. S'il y a des noms simples, est-ce que groupId sauvera les noms d'artefacts dupliqués (qui se produiront en raison de la simplicité) des collisions dans le dépôt?
  4. Qu'en est-il de la recherche et de la recherche d'artéfacts sur web / dépôts avec des noms dupliqués (pour des raisons de simplicité)?

je ne veux pas voir dans mon projet de la structure d'un module de type projet-portail liferay-plugins-thèmes pour les parents ou pire encore de projet-portail liferay-plugins-thèmes-blanc-chiot-wtf-nom pour les enfants.

si vous pouviez fournir votre opinion et votre pratique pour l'une des questions mentionnées et les problèmes possibles, ce serait une grande aide non seulement pour moi, mais pour tous les utilisateurs maven. Remercier.

30
demandé sur Community 2012-02-24 21:43:36

3 réponses

dans les premiers jours avec maven j'ai suivi la structure suivante que vous avez décrit:

appname
  +--- appname-module1
  +--- appname-module2
              +--- appname-module2-chhild1
              +--- appname-module2-chhild2
  +--- appname-module3

mais cela deviendra ridicule si vous obtenez plus de niveaux.

alors j'ai décidé de changer d'avis et maintenant en utilisant des choses comme:

appname
  +--- module1
  +--- module2
          +--- chhild1
                 +--- subchild1
          +--- chhild2
  +--- module3

la seule chose que je change à travers les niveaux est le groupId...

appname (groupId: com.soebes.appname)
  +--- module1 (groupId: com.soebes.appname.module1)
  +--- module2 (groupId: com.soebes.appname.module2)
          +--- chhild1 (groupId: com.soebes.appname.module1.child1)
          +--- chhild2 (groupId: com.soebes.appname.module1.child2)
  +--- module3 (groupId: com.soebes.appname.module3)
18
répondu khmarbaise 2017-12-05 15:07:36

Je ne pense pas qu'il y ait de conventions qui précisent clairement comment vous devez configurer votre structure de projet dans ce cas.

E. G. Je voudrais essayer de répondre où les artéfacts finissent avec leur nom et whats la chance de courir dans un conflit. Pour un framework comme spring il est logique d'avoir le nom du projet dans l'artifactId ("spring-*"), il en va de même pour les communs - bibliothèques (bien que "commons-logging" puisse avoir un nom risqué).

pour un projet autonome I n'est probablement pas nécessaire. Mais il semble que vous allez utiliser un portail liferay où beaucoup de pots différents seront autour de sorte que je voudrais encourager un préfixe pour les artéfacts. Mais je n'essaierais pas de reconstruire la structure du projet sur la base des artifactId. Ainsi, "project-modulename" sera un bon nom de module. Puisque les jarres construiront classpath et que la structure de dépendance a été définie pendant la construction, ce n'est pas un problème. Si vous avez besoin de reconstruisez l'arbre des dépendances à partir d'une liste de jars: maven inclut des informations dans META-INF (si vous utilisez le plugin release-plugin, que je recommande également) afin que les informations puissent être récupérées à partir de là.

je recommande aussi de ne pas emboîter les modules en profondeur. Eclipse a quelques problèmes avec cela (IntelliJ ne fait pas, Netbeans afaik soutient des structures imbriquées aussi).

le principal module portail peut ne pas changer que souvent par rapport aux modules plugin. J'ai donc fait cela permettrait également de libérer les projets séparément.

pour moi, c'est une bonne pratique de nommer les modules parents avec le suffixe"- parent". Ces modules sont rarement utilisés comme dépendance et un "parent" pour une dépendance indiquerait que quelque chose est suspect. Comme vous l'avez dit: artifacId et le nom du module doivent être les mêmes. Je recommande également l'utilisation de l'artifactId comme nom dans le pom. Certains plugins ne considèrent pas les différences ici et aussi Eclipse se comporte mieux si ces valeurs sont toutes les mêmes.

il est vrai que le goupId et l'artifactId contiennent souvent des informations en double (par exemple des parties de celui-ci seront le nom du projet). Si c'était fait exprès ou s'est vraiment passé dans les dernières années...? Je ne sais pas mais je tiens à garder de cette façon. Les artefacts sont identifiés à l'aide des coordonnées GAV(P) (groupId, artifactId, version, (packaging)). Si groupId ou artifactId contiennent les artéfacts de projectname sont plus faciles à trouver si vous seulement l'un d'entre eux.

trouver des artéfacts est facile si vous exécutez un gestionnaire de dépôt (comme Nexus, Artifactory, Archiva). La recherche rendra souvent groupide / artificiel et ainsi de suite si une recherche pour "util" vous donnerait assez d'information pour trouver l'artefact que vous recherchez.

espère que cela a aidé un peu :) ce qui concerne les

wemu

4
répondu wemu 2012-02-27 07:26:12

une autre approche possible consiste à examiner les groupes de fonctions plus que la hiérarchie.

dire que le projet B A webapps, plugins et librairies de base, puis tous les modules partagent le même identifiant de groupe (com.mycompany.b) et les artéfacts sont respectivement appelés webapp-???, plugin -??? et core???.

nous utilisons également la convention-parent mentionnée plus haut: par conséquent, le parent POM pour tous les webapps est appelé webapp-parent.POM.

2
répondu b75. 2012-03-10 11:45:34