Artefact Maven et dénomination groupId

291

Je suis actuellement en train de déplacer un projet de Ant à Maven. Conformiste comme je suis, je veux utiliser des conventions bien établies pour trouver groupIdet artifactId, mais je ne trouve pas de conventions détaillées (il y en a, mais elles ne couvrent pas les points sur lesquels je me pose des questions).

Prenez ce projet par exemple, d'abord le package Java: com.mycompany.teatimer

La minuterie de thé est en fait deux mots, mais les conventions de dénomination des packages Java interdisent l'insertion de traits de soulignement ou de traits d'union, donc j'écris tout cela ensemble.

J'ai choisi l' groupIdidentique de l'ID du package car je pense que c'est une bonne idée. C'est ça?

Enfin, je dois choisir un artifactId, je suis actuellement allé pour teatimer. Mais quand je regarde d' autres projets Maven, ils utilisent des traits d' union pour séparer les mots en artifactIds, comme ceci: tea-timer. Mais il n'a pas l' air bizarre quand concaténé à groupId: com.mycompany.teatimer.tea-timer.

Comment ferais-tu ceci?

Un autre exemple:

Nom du paquet: com.mycompany.awesomeinhouseframework

groupId: com.mycompany.awesomeinhouseframework(?)

artifactId: awesome-inhouse-framework(?)

Noarth
la source
1
Où voyez-vous le groupId concaténé avec l'artefactId? Je pense que les conventions que vous énoncez sont les bonnes.
Abhinav Sarkar
2
En fait, les traits de
Adriaan Koster

Réponses:

146

Votre convention semble raisonnable. Si je cherchais votre framework dans le repo Maven, je chercherais awesome-inhouse-framework-x.y.jardans le com.mycompany.awesomeinhouseframeworkrépertoire du groupe. Et je le trouverais là selon votre convention.

Deux règles simples fonctionnent pour moi:

  • packages de domaine inversé pour groupId (car ils sont assez uniques) avec toutes les contraintes concernant les noms des packages Java
  • le nom du projet en tant qu'artefactId (en gardant à l'esprit qu'il devrait être compatible avec le nom du pot, c'est-à-dire ne pas contenir de caractères qui peuvent être invalides pour un nom de fichier ou tout simplement bizarres)
Henryk Konsek
la source
D'accord, si abhin4v et vous pensez que c'est normal, alors je vais le faire comme ça, merci!
Noarth
Je trouve le mélange de non-trait d'union (awesomeinhouseframework) et de trait d'union (awesome-inhouse-framework) orthographe un peu étrange. Étant donné que le groupid n'autorise pas les tirets, je m'en tiendrai également à l'orthographe sans trait d'union pour l'artefactide.
Michael Küller
3
Veuillez clarifier ce que vous entendez par "nom du pot".
vikramvi
1
Clarifié dans la réponse :).
Henryk Konsek
241

La bizarrerie est très subjective, je suggère simplement de suivre la recommandation officielle:

Guide des conventions de dénomination sur groupId, artifactId et version

  • groupIdidentifiera votre projet de manière unique sur tous les projets, nous devons donc appliquer un schéma de dénomination. Il doit suivre les règles de nom de package, ce qui signifie qu'il doit s'agir au moins d'un nom de domaine que vous contrôlez, et vous pouvez créer autant de sous-groupes que vous le souhaitez. Regardez Plus d'informations sur les noms de packages .

    par exemple. org.apache.maven,org.apache.commons

    Un bon moyen de déterminer la granularité du groupId est d'utiliser la structure du projet. Autrement dit, si le projet en cours est un projet à plusieurs modules, il doit ajouter un nouvel identifiant au groupId du parent.

    par exemple. org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactIdest le nom du pot sans version. Si vous l'avez créé, vous pouvez choisir le nom que vous voulez avec des lettres minuscules et aucun symbole étrange. S'il s'agit d'un pot tiers, vous devez prendre le nom du pot tel qu'il est distribué.

    par exemple. maven,commons-math

  • versionsi vous le distribuez, vous pouvez choisir n'importe quelle version typique avec des nombres et des points (1.0, 1.1, 1.0.1, ...). N'utilisez pas de dates car elles sont généralement associées à des versions instantanées (nocturnes). S'il s'agit d'un artefact tiers, vous devez utiliser leur numéro de version quel qu'il soit, et aussi étrange que cela puisse paraître.

    par exemple. 2.0, 2.0.1,1.3.1

Pascal Thivent
la source
4
Je connais ces conventions, mais elles ne disent pas vraiment comment le nom de l'artefact doit être composé (il n'y a pas de conventions de dénomination JAR) et quoi faire s'il serait le même que le groupId - je n'ai pas vu un seul POM où c'est le cas.
Noarth
@Noarth 1. Le nom de l'artefact est à votre discrétion (mais l'utilisation de tirets dans le nom est une pratique courante). 2. Vous recherchez une "règle" absolue qui n'existe pas (et si votre cadre interne génial est composé de plusieurs modules?). Voir par exemple les artefacts Spring, Maven, Hibernate, etc.
Pascal Thivent
Non, non, je n'ai pas de modules, juste des projets simples. En fait, nous n'avons pas de projet appelé "cadre interne génial" :)
Noarth
11
Et alors package? Quelle est la différence avec groupId?
KonstantinK
1
Est-ce que l'artefactId peut contenir des nombres?
theonlygusti
100

Envisagez de suivre les étapes suivantes pour créer la première application Maven de base :

groupId

  • com.companyname.project

artifactId

  • projet

version

  • 0.0.1
Manwal
la source
En tant que travail pour la location, dois-je utiliser com.my.company.projectcomme groupIdou com.client.company.project?
Giacomo Alzetta
@GiacomoAlzetta, vous pouvez mieux utiliser n'importe quel formiate. Quelques exemples «com.companyName.hirePortal» ou «org.compnayName.hirePortal».
Manwal
3
groupId devrait être com.companyname et non com.companyname.project
Kamil Nekanowicz
1

Cependant, je ne suis pas d'accord avec la définition officielle du Guide des conventions de dénomination sur groupId, artifactId et la version qui propose que groupId doit commencer par un nom de domaine inversé que vous contrôlez.

comsignifie que ce projet appartient à une entreprise et orgsignifie que ce projet appartient à une organisation sociale. Ce n'est pas grave, mais pour ces domaines étranges comme xxx.tv, xxx.uk, xxx.cn, cela n'a pas de sens de nommer le groupId commencé par "tv", "cn.", Le groupId devrait fournir les informations de base du projet plutôt que du domaine.

Tommy.Tang
la source
2
Cette convention empêche les développeurs d'utiliser maven car vous devez posséder un domaine avant de déployer vos artefacts dans le référentiel central maven. C'est ridicule. Posséder un domaine pourrait coûter assez cher d'année en année.
Tommy.Tang
1
Il n'est pas nécessaire de posséder un enregistrement pour ce nom de domaine. La seule exigence est que votre ID de groupe, qui sera le nom de votre package Java, n'entre pas en conflit avec un autre nom lors du déploiement. Cette convention n'empêche certainement pas les développeurs d'utiliser Maven.
Basil Bourque
Une bonne pratique consiste à dériver les noms des packages à partir de l'URL du référentiel. Si vous utilisez GitHub, votre compte est appelé myuseret votre référentiel est appelé myrepo, utilisez simplement le nom du package com.github.myuser.myrepo. C'est gratuit et toujours unique.
fxnn
-14

Considérez ceci pour obtenir un fichier jar entièrement unique:

  • GroupID - com.companyname.project
  • ArtifactId - com-companyname-project
  • Package - com.companyname.project
codeur
la source