2016-06-27 28 views
2

Wir verwenden Maven, um unsere Abhängigkeiten zwischen unseren Microservices zu definieren und zu verwalten. Hier ein Beispiel:Verwalten mehrerer Abhängigkeiten zwischen Microservices mit Maven

Micro 1

<artifactId>ms-1</artifactId> 
<version>0.25.04-SNAPSHOT</version> 
<dependencies> 
    <dependency> 
     <artifactId>ms-2</artifactId> 
     <version>0.25.00-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

Micro 2

<artifactId>ms-2</artifactId> 
<version>0.25.00-SNAPSHOT</version> 
<dependencies> 
    <dependency> 
     <artifactId>ms-3</artifactId> 
     <version>0.28.00-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

Das Problem ist, dass die Release-Phase viel Zeit nimmt und ist voll manuell:

  1. 0 durchführenzum ersten Micro (entfernt -SNAPSHOT)
  2. Änderung der Version in pom.xml der Abhängigkeit
  3. mvn:release für das zweite Microzuführen (entfernt -SNAPSHOT)
  4. usw. (tatsächlich auf 15 Microservices ...)

Ich frage mich, ob es eine automatisierte Möglichkeit gibt, diese Version (in Kaskade) durchzuführen?

Dank

Antwort

3

Ein Maven-Projekt ist nicht verantwortlich für die Versionen ihrer Abhängigkeiten zu verwalten. Es ist das Projekt, das ein Abhängigkeitsartefakt erstellt, das für seine Version verantwortlich ist.

In Ihrem Fall könnten Sie einen (pseudo-) Aggregator Projekt erstellen, die alle Ihre Microservices als Submodule enthalten:

<modules> 
    <module>../ms-1</module> 
    <module>../ms-2</module> 
    <module>../ms-3</module> 
    <module>../...</module> 
    <module>../ms-15</module> 
</modules> 

Unter der Annahme, dass Ihre Micro Projekte Geschwister zueinander wie sind:

+- (pseudo-)aggregator 
| +- pom.xml 
+- ms-1 
| +- pom.xml 
+- ms-2 
| +- pom.xml 
+- ms-3 
| +- pom.xml 
+- ms-... 
| +- pom.xml 
+- ms-15 
    +- pom.xml 

Wenn sie nicht passen die relativen s Pfade entsprechend.

Solche Sie werden für die Release-Versionen von allen Projekten gefragt (Standard ist der aktuelle <version> minus -SNAPSHOT, durch nur bestätigt werden Enter) während eines .../(pseudo-)aggregator $ mvnrelease:prepare, die auch entsprechend Ihrem <dependencies>/<dependency>/<version> s aktualisiert.

Oder Sie können eine non-interactive release mit -B | --batch-mode, die die Standardeinstellungen ohne zu fragen verwendet.

Und schließlich eine Änderung:

release ist kein Phase von Maven's build lifecycles. Es ist die Abkürzung für die maven-release-plugin, die verschiedene goals hat.

+0

Das ist interessant, ich wusste nicht über Maven Aggregator. Lass mich neu formulieren, um zu überprüfen, ob ich recht habe. Sie schlagen vor, ich ein engagiertes POM-Projekt zu schaffen, das alle meine Microservices als Modul definiert, und dann die Mavenziele anruft, um eine Freigabe durchzuführen? – frinux

+0

@Frinux Das stimmt. Siehe [POM-Referenz, Aggregation] (https: //maven.apache.org/pom.html # Aggregation) und [Maven: Die vollständige Referenz, 3.6.2. Multi-Modul gegen Vererbung] (http://books.sonatype.com/mvnref-book/reference/pom-relationship-sect-pom-best-practice.html#pom-relationship-sect-multi-vs-inherit) für grundlegende Informationen. Siehe auch [diese Antwort] (http://stackoverflow.com/a/30953905/1744774) für die Zusammenarbeit von Phasen, Plugins, Zielen usw. –

+0

Es gibt ein Detail, das ich vergessen habe zu erwähnen: Die Microservices konsumieren sich gegenseitig über ein JAR (HTTP client), das generiert wird, aber zum Zeitpunkt der Maven-Veröffentlichung nicht existiert. Es scheint, dass es unmöglich ist, ein Modul zu deklarieren, wenn es zum Zeitpunkt der Erstellung nicht existiert. Habe ich Unrecht? – frinux