Maven Namenskonventionen für hierarchische multiple-module-Projekten
Ich habe eine Frage, auf die Maven-Konventionen (groupId, artifactId und Verzeichnis-Namen) in eine mehrfach-Modul-Projekt mit einem hierarchischen Verzeichnis structrure.
Forschung
Bevor Sie Fragen, ich ging durch andere im web über dieses Thema und was ich konnte für mich selbst heraus:
-
Projekt-Verzeichnis Namen sollten übereinstimmen
artificatId. -
Leitfaden für Namenskonventionen
Beispiele:-
groupId identifizieren Sie Ihr Projekt eindeutig über alle Projekte, so müssen wir erzwingen ein Namensschema. Es Folgen der name des Pakets Regeln (zB. org.apache.maven, org.apache.commons org.apache.maven.plugins)
-
artifactId, Wenn Sie es erstellt haben, dann können Sie wählen, welchen Namen Sie wollen mit Kleinbuchstaben und keine seltsamen Symbolen.
(zB. maven, commons-math)
-
Dies ist ganz einfach und ich verstehe es, aber es gibt nur wenige Dinge, die sind noch unklar.
artifactId Beispiele erwähnt, in Konventionen können nur angewandt werden, um ein-level-Hierarchie-Modul.
Beispiele
Ging ich über maven-repositories und extrahiert einige Beispiele:
Frühling meist verwendet Namen: spring-core, spring-context -, spring-Kontext-zu unterstützen. Alle standalone-Module sind mit einer level-Hierarchie und-Feder - Präfix für die Suche nach Effizienz. Es gibt keine Probleme, da die Hierarchie ist nicht tief.
Apache CXF Bezeichnungen sind Recht unkonventionell für Apache. Artefakte sind eigenständige Module mit bis zu 5 möglichen unterschiedlichen Artefakte im Namen zB. cxf-tools-wsdlto-databinding-jaxb.
Gibt es viele Artefakte (cxf-rt-databinding-jaxb, cxf-rt-databinding-aegis, cxf-rt-databinding-xmlbeans, cxf-rt-databinding-sdo), die zusammengefasst werden können in mehreren Modulen Projekt (cxf-rt-databindings), hat Sie aber nicht und so die Namen wurden spaghetti.
Schließlich Maven-Plugins ist zunächst eine aus mehreren Modulen Projekt (nach org.apache.maven), die Artefakte wie: maven-compiler-plugin, maven-enforcer-plugin.
Es gibt durchaus eine Menge Beispiele-und die Folgen alle anderen Konventionen über die Benennung artifactIds (daher Projekt-Verzeichnisse).
Ausgang
Einnahme von best practices aus den Beispielen lassen Sie uns betrachten, Hierarchie-Ebenen.
Einer Hierarchieebene benennen wäre (
groupId: org.organization.project
artifactId: project-portal ---.
|
project-portal-service
|
project-portal-plugins (continued on next diagram)
|
project-portal-util
(Fortsetzung) zwei-Ebenen-Hierarchie wäre:
groupId: org.organization.project.plugins
artifactId: project-portal-plugins ---.
|
project-sample-plugin
|
project-another-great-plugin
|
???? (multiple module project)
Sehen Sie Fragezeichen? Das ist, wo die
Fragen
Ich folgte Konventionen Beispiele (ignorieren spaghetti Apache CXF Beispiel):
- Root - Projekt-portal (zB. Feder-Kern -, maven-core)
- First-level-Namen der Hierarchie Erben von root - Projekt-portal-plugins (zB. spring-Kontext-Unterstützung).
- Second-level-Hierarchie Namen - Projekt-Beispiel-plugin (zB. maven-compiler-plugin).
Und wir sind nun fest auf der Dritten Ebene, wie in den alten games ohne speichert und checkpoints.
- Ist dies der richtige directory naming Weg von Maven Beispiele für tiefere Hierarchie-Ebenen?
- Gibt es irgendwelche Konventionen oder Regeln, die Sie Folgen, um support-einfache Verzeichnis-und Artefakt-Namen zu vermeiden spaghetti Namen auf tieferen Ebenen?
- Wenn es einfache Namen, wird groupId speichern dupliziert Artefakt-Namen (die auftreten, aufgrund der Einfachheit) von Kollisionen im repository?
- Was über das suchen und finden von Artefakten, die auf web - /repositories mit doppelte Namen (wegen der Einfachheit)?
Ich nicht wollen, um zu sehen, in meinem Projekt-Struktur ein Modul wie Projekt-portal-liferay-plugins-themes für Eltern oder-noch schlimmer-Projekt-portal-liferay-plugins-themes-weiß-Welpen-wtf-Namen für Kinder.
Wenn Sie könnte Ihre Meinung und Praxis für jede der genannten Fragen und möglichen Problemen, das wäre eine große Hilfe nicht nur für mich, sondern für alle, die mit maven. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In früheren Tagen mit maven habe ich die folgende Struktur entwickelt, die Sie beschrieben haben:
Aber das wird lächerlich werden, wenn man mehr Ebenen.
Also habe ich beschlossen, meine Meinung zu ändern und nun mit Dingen wie:
Die einzige Sache, die ich ändern durch die levels, wird die Gruppen-id...
groupId:artifactId
-, Ordner-Struktur UND Projekt<name>
synchronisiert, so dass wenn ich einen Reaktor zu bauen, kann ich klar sehen, was ist der Bau und behalten einen Blick auf die Hierarchie (wie der Reaktor nicht unbedingt bauen um). Die andere Sache ist, dass Sie mit einem großen Projekt, müssen Sie möglicherweise mehrere sub-Projekte, die haben die gleichen artifactId (aber eine andere Gruppen-id, und dies hilft, um Verwirrung zu vermeiden - mit einer offensichtlichen Kosten :))Ich glaube nicht, es gibt Konventionen, die eindeutig angeben, wie Sie sollten-setup die Struktur Ihres Projekts, in diesem Fall.
E. g. Ich würde versuchen zu beantworten, wo die Artefakte am Ende mit Ihrem Namen und was ist die chance, läuft in einen Konflikt.
Für ein framework wie spring es macht Sinn, um den Namen des Projekts in der artifactId ("Frühling" -*"), Gleiches gilt für die commons - Bibliotheken (obwohl "commons-logging" kann durch eine riskante Namen).
Für ein Projekt, das läuft standalone-I ist wahrscheinlich nicht notwendig, dies zu tun. Aber wie es aussieht, werde ein liferay-portal, wo viele verschiedene Gläser um, so würde ich Sie ermutigen, einen Präfix für die Artefakte.
Aber ich würde nicht versuchen, neu zu erstellen die Projekt-Struktur basierend auf artifactId ist. So "Projekt-modulename" wird eine gute Modul-Namen. Da die Gläser bauen Sie den Klassenpfad und die Abhängigkeit der Struktur definiert wurde, während das bauen, dies ist nicht ein Problem. Wenn Sie brauchen, um wieder aufzubauen, den Abhängigkeitsbaum auf der Grundlage einer Liste von jars: maven beinhaltet Informationen, die in META-INF (wenn Sie die release-plugin, was ich auch empfehle), so dass die Informationen können abgerufen werden von dort aus.
Ich würde auch empfehlen, nicht nest-Modulen zu tief. Eclipse hat einige Probleme mit diesem (IntelliJ nicht, Netbeans afaik unterstützt verschachtelte Strukturen zu).
Dem portal-Modul können nicht ändern, die oft im Vergleich zu den plugin-Module. So ich sinnvoll, diese aufzuteilen in separate Projekte - dies würde es auch erlauben, die Freigabe der Projekte separat.
Für mich ist es eine gute Praxis zu benennen übergeordnete Module, die mit "Eltern" - suffix. Diese Module werden nur selten verwendet, da Abhängigkeit und ein "Elternteil" für eine Abhängigkeit geben würde, etwas, was verdächtig ist. Als Sie sagte: artifacId-und Modul-name sollte der gleiche sein. Ich würde empfehlen, auch die artifactId, wie Namen in der pom. Einige plugins, dont betrachten Unterschiede hier und auch Eclipse verhält sich besser, wenn diese Werte gleich sind.
Es ist wahr, die goupId und die artifactId enthalten oft doppelte Informationen (z.B. Teile, es wird der Projektname). Wenn das war Absicht, oder passiert ist in den letzten Jahren...? Ich weiß nicht, aber ich würde halten Sie es auf diese Weise. Artefakte sind gekennzeichnet mit der GAV(P) - Koordinaten (groupId, artifactId, version, (Verpackungs -)). Wenn groupId oder artifactId enthalten projectname Artefakte sind einfach zu finden, wenn man nur eine von Ihnen.
Suche nach Artefakten ist einfach, wenn Sie ein repository-manager (wie Nexus, Artifactory, Archiva). Die Suche wird oft Rendern groupId/artifactId und so weiter, so dass eine Suche nach "util" würde Ihnen genug Informationen zu finden, das Artefakt, die Sie suchen.
hoffe, das half ein wenig 🙂
hinsichtlich
wemu
Ein weiterer möglicher Ansatz ist die Betrachtung der Funktion Gruppen mehr als die Hierarchie.
Sagen, Projekt B hat webapps, plugins und core-Bibliotheken, dann alle Module teilen die gleiche Gruppen-id (com.MeineFirma.b) und Artefakte sind jeweils benannt webapp-???, plugin-??? und core-???.
Nutzen wir auch die -Eltern-Konvention erwähnt: also, das übergeordnete POM für alle webapps genannt wird webapp-Eltern.pom.