Benennung von Maven-Artefakten und Gruppen-IDs


291

Ich bin gerade dabei, ein Projekt von Ant nach Maven zu verlegen. Konformist wie ich bin, möchte ich gut etablierte Konventionen verwenden, um groupIdund zu finden artifactId, aber ich kann keine detaillierten Konventionen finden (es gibt einige, aber sie decken nicht die Punkte ab, über die ich mich wundere).

Nehmen Sie dieses Projekt zum Beispiel zuerst das Java-Paket: com.mycompany.teatimer

Tea Timer besteht eigentlich aus zwei Wörtern, aber die Namenskonventionen für Java-Pakete verbieten das Einfügen von Unterstrichen oder Bindestrichen, daher schreibe ich alles zusammen.

Ich habe die groupIdidentische mit der Paket-ID gewählt, weil ich das für eine gute Idee halte. Ist es?

Schließlich muss ich eine auswählen artifactId, für die ich mich gerade entschieden habe teatimer. Aber wenn ich mir andere Maven-Projekte ansehe, verwenden sie Bindestriche, um Wörter in artifactIds zu teilen , wie folgt : tea-timer. Aber es sieht seltsam aus, wenn es mit dem verkettet wird groupId: com.mycompany.teatimer.tea-timer.

Wie würdest du das machen?

Ein anderes Beispiel:

Paketnamen: com.mycompany.awesomeinhouseframework

groupId: com.mycompany.awesomeinhouseframework(?)

artifactId: awesome-inhouse-framework(?)


1
Wo sehen Sie die mit der Artefakt-ID verkettete Gruppen-ID? Ich denke, die Konventionen, die Sie angeben, sind die richtigen.
Abhinav Sarkar

2
Tatsächlich sind Unterstriche in Java-Paketnamen zulässig, siehe: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html
Adriaan Koster

Antworten:


146

Ihre Konvention scheint vernünftig zu sein. Wenn ich im Maven-Repo nach Ihrem Framework suchen würde, würde ich awesome-inhouse-framework-x.y.jarim com.mycompany.awesomeinhouseframeworkGruppenverzeichnis danach suchen . Und ich würde es dort gemäß Ihrer Konvention finden.

Für mich funktionieren zwei einfache Regeln:

  • Reverse-Domain-Pakete für groupId (da diese ziemlich eindeutig sind) mit allen Einschränkungen bezüglich der Namen von Java-Paketen
  • Projektname als Artefakt-ID (wobei zu beachten ist, dass er jar-name-freundlich sein sollte, dh keine Zeichen enthält, die für einen Dateinamen möglicherweise ungültig sind oder nur seltsam aussehen)

Okay, wenn du und abhin4v denken, dass es normal ist, dann mache ich es einfach so, danke!
Noarth

Ich finde die Mischung aus Nicht-Bindestrich (awesomeinhouseframework) und Bindestrich (awesome-inhouse-Framework) etwas seltsam. Da die Gruppen-ID keine Bindestriche zulässt, würde ich mich auch an die Nicht-Bindestrich-Schreibweise für die Artefakt-ID halten.
Michael Küller

3
Bitte klären Sie, was Sie unter "jar-name-freundlich" verstehen.
Vikramvi

1
In der Antwort geklärt :).
Henryk Konsek

241

Seltsamkeit ist sehr subjektiv, ich schlage nur vor, der offiziellen Empfehlung zu folgen:

Anleitung zu Namenskonventionen für Gruppen-ID, Artefakt-ID und Version

  • groupIdidentifiziert Ihr Projekt in allen Projekten eindeutig, daher müssen wir ein Namensschema erzwingen. Es muss den Regeln für Paketnamen folgen. Dies bedeutet, dass dies mindestens ein Domänenname sein muss, den Sie steuern, und Sie können so viele Untergruppen erstellen, wie Sie möchten. Weitere Informationen zu Paketnamen finden Sie unter .

    z.B. org.apache.maven,org.apache.commons

    Eine gute Möglichkeit, die Granularität der groupId zu bestimmen, ist die Verwendung der Projektstruktur. Das heißt, wenn das aktuelle Projekt ein Projekt mit mehreren Modulen ist, sollte es eine neue Kennung an die groupId des übergeordneten Elements anhängen.

    z.B. org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting

  • artifactIdist der Name des Glases ohne Version. Wenn Sie es erstellt haben, können Sie einen beliebigen Namen mit Kleinbuchstaben und ohne seltsame Symbole auswählen. Wenn es sich um ein Glas eines Drittanbieters handelt, müssen Sie den Namen des Glases so verwenden, wie es verteilt wird.

    z.B. maven,commons-math

  • versionWenn Sie es verteilen, können Sie eine typische Version mit Zahlen und Punkten (1.0, 1.1, 1.0.1, ...) auswählen. Verwenden Sie keine Datumsangaben, da diese normalerweise mit SNAPSHOT-Builds (nächtlich) verknüpft sind. Wenn es sich um ein Artefakt eines Drittanbieters handelt, müssen Sie dessen Versionsnummer verwenden, unabhängig davon, um was es sich handelt und so seltsam es auch aussehen mag.

    z.B. 2.0, 2.0.1,1.3.1


4
Ich kenne diese Konventionen, aber sie sagen nicht wirklich, wie der Artefaktname aufgebaut sein soll (es gibt keine JAR-Namenskonventionen) und was zu tun ist, wenn er mit der groupId identisch wäre - ich habe kein einziges POM gesehen wo das der Fall ist.
Noarth

@Noarth 1. Der Name des Artefakts liegt in Ihrem Ermessen (die Verwendung von Bindestrichen im Namen ist jedoch eine gängige Praxis). 2. Sie suchen nach einer absoluten "Regel", die es nicht gibt (was ist, wenn Ihr fantastisches internes Framework aus mehreren Modulen besteht?). Siehe zum Beispiel die Artefakte Spring, Maven, Hibernate usw.
Pascal Thivent

Nein, nein, ich habe keine Module, nur einfache Projekte. Tatsächlich haben wir kein Projekt namens "Awesome Inhouse Framework" :)
Noarth

11
Was ist mit package? Was ist der Unterschied zu groupId?
KonstantinK

1
Darf die Artefakt-ID Zahlen enthalten?
theonlygusti

100

Beachten Sie beim Erstellen der ersten Maven- Basisanwendung Folgendes :

groupId

  • com.companyname.project

artifactId

  • Projekt

version

  • 0.0.1

Als Mietobjekt sollte ich com.my.company.projectals groupIdoder verwenden com.client.company.project?
Giacomo Alzetta

@GiacomoAlzetta Sie können jedes Format verwenden, das Ihnen besser passt. Einige Beispiele 'com.companyName.hirePortal' oder 'org.compnayName.hirePortal'.
Manwal

3
groupId sollte com.companyname nicht com.companyname.project sein
Kamil Nekanowicz

1

Ich bin jedoch nicht einverstanden mit der offiziellen Definition des Leitfadens für Namenskonventionen für Gruppen-ID, Artefakt-ID und Version, in der vorgeschlagen wird, dass die Gruppen-ID mit einem umgekehrten Domänennamen beginnen muss, den Sie steuern.

combedeutet, dass dieses Projekt einem Unternehmen gehört und orgdass dieses Projekt einer sozialen Organisation gehört. Diese sind in Ordnung, aber für diese seltsamen Domänen wie xxx.tv, xxx.uk, xxx.cn ist es nicht sinnvoll, die mit "tv.", "Cn." Begonnene groupId zu benennen. Die groupId sollte die grundlegenden Informationen liefern des Projekts eher als die Domäne.


2
Diese Konvention verhindert, dass Entwickler Maven verwenden, da Sie über eine Domäne verfügen müssen, bevor Sie Ihre Artefakte im zentralen Maven-Repository bereitstellen können. Es ist lächerlich. Der Besitz einer Domain kann Jahr für Jahr ziemlich kostspielig sein.
Tommy.Tang

1
Es ist nicht erforderlich, eine Registrierung für diesen Domainnamen zu besitzen. Die einzige Voraussetzung ist, dass Ihre Gruppen-ID, bei der es sich um Ihren Java-Paketnamen handelt, bei der Bereitstellung nicht mit einem anderen Namen in Konflikt steht. Diese Konvention hindert Entwickler sicherlich nicht daran, Maven zu verwenden.
Basil Bourque

Eine gute Vorgehensweise besteht darin, Paketnamen von der Repository-URL abzuleiten. Wenn Sie GitHub verwenden, wird Ihr Konto aufgerufen myuserund Ihr Repository aufgerufen. Verwenden Sie myrepodann einfach den Paketnamen com.github.myuser.myrepo. Das ist kostenlos und immer noch einzigartig.
fxnn

-14

Betrachten Sie dies, um eine vollständig eindeutige JAR-Datei zu erhalten:

  • GroupID - com.companyname.project
  • ArtifactId - com-Firmenname-Projekt
  • Paket - com.companyname.project
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.