maven-release-plugin in Action
Tento příspěvek vznikl jako reakce na článek Honzy Hovotného „Co bych rád slyšel v září na CZJUG“, ve kterém se ptal myslím na release maven multiprojectu a na stanovení jednotné verze pro modul s potomky. Už dříve jsem s tím nějakou dobu strávil, protože jsem to chtěl v práci vyřešit, tehdy se mi to nepodařilo, ale myslel jsem si, že jsem byl blízko. Proto jsem si našel chvíli času a rozhodl jsem se ten problém rozkousnout. Doufám že vám to přisěje i k diskusi na CZJUG já se jako obvykle nedostavím.
Pokusím se vás provést krok za krokem. A snad se vám to taky podaří.
Příprava
Takže co potřebujeme? Potřebujeme maven, cvs a maven repository. Ja mám svoje maven repository na svém hostingu a deployuji tam pomocí ftp což jsem ze začátku trošku složitější, ale nakonec ftp je přece jen častěji dostupnějsí než jiné metody. Cvs mám taky nainstalované na localhostu, takže si budete muset udělat svoje. Potřebujeme také maven multiproject, na vyzkoušení můžete použít tenhle jednoduchý, který jsem si na to vytvořil já (maven-multiproject-test).
Podívejme se na naše pom(y).xml
mmt/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com_3rojka.maven.test</groupId>
<artifactId>mmt</artifactId>
<packaging>pom</packaging>
<version>0.9-SNAPSHOT</version>
<name>Maven Multiproject Test</name>
<scm>
<!-- tady si budete muset naspat svůj connection string -->
<!-- scm:cvs:method:username:password@server:cvsroot:module -->
<developerConnection>scm:cvs:pserver:3rojka:@localhost:/work/cvs-repositories/eclipse-1:mmt</developerConnection>
</scm>
<modules>
<module>A</module>
<module>B</module>
</modules>
<distributionManagement>
<!-- use the following if you're not using a snapshot version. -->
<repository>
<id>maven-3rojka-com</id>
<name>maven-3rojka-inhouse repo</name>
<url>
ftp://ftp.3rojka.com/public_html/maven/maven2/repos/inhouse-1
</url>
</repository>
<!-- use the following if you ARE using a snapshot version. -->
<snapshotRepository>
<id>maven-3rojka-com</id>
<name>maven-3rojka-inhouse repo</name>
<url>
ftp://ftp.3rojka.com/public_html/maven/maven2/repos/inhouse-1
</url>
</snapshotRepository>
</distributionManagement>
<build>
<!-- tahle extension je potřeba pro ftp deploy -->
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-beta-2</version>
</extension>
</extensions>
</build>
</project>
Pokud budete deployovat jako na nějaký remote server budete potřebovat nastavit username a password. Takže je potřeba konfigurovat setting.xml
....
<servers>
<server>
<!-- všimněte si že podobnost tohoto id a id repository v distributionManagmantu v pom.xml není náhodná -->
<id>maven-3rojka-com</id>
<username>...tohle je na vás ...</username>
<password>...a tohle už tím tuplem</password>
</server>
</servers>
....
Tak už jenom pro úplnost mnt/A/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>mmt</artifactId>
<groupId>com_3rojka.maven.test</groupId>
<version>1.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com_3rojka.maven.test</groupId>
<artifactId>mmt-A</artifactId>
<packaging>jar</packaging>
<name>Maven Multiproject Test - module A</name>
</project>
a mmt/B/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>mmt</artifactId>
<groupId>com_3rojka.maven.test</groupId>
<version>1.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com_3rojka.maven.test</groupId>
<artifactId>mmt-B</artifactId>
<packaging>jar</packaging>
<name>Maven Multiproject Test - module B</name>
<!-- tady jsem si jako perličku ještě udělal závislost mezi submoduly -->
<dependencies>
<dependency>
<groupId>com_3rojka.maven.test</groupId>
<artifactId>mmt-A</artifactId>
<version>${version}</version>
</dependency>
</dependencies>
</project>
Pustíme se do práce
1. Rozbalíme si mmt.zip do adresáře mmt a importujeme jej jako modul mmt do cvs.
2. teď protože máme project commitnutý mužeme přistoupit k mvn release:prepareD:\work\eclipse-ws-2-maven\mmt>mvn release:prepare -DautoVersionSubmodules=truetady to autoVersionSubmodules je very kool trick který zajistí verzovaní modulu stejně jako verzi parenta. maven se nás pěkně zeptá…. What is the release version for „Maven Multiproject Test“? (com_3rojka.maven.tes t:mmt) 0.9: :…. a protéže máme hezkou snapshot verzi sám nám nabídne 0.9 takže stačí enter…. What is SCM release tag or label for „Maven Multiproject Test“? (com_3rojka.mave n.test:mmt) mmt-0_9: :…. taky nám doporučí cvs tag, taky enter….
What is the new development version for „Maven Multiproject Test“? (com_3rojka.maven.test:mmt) 0.10-SNAPSHOT: :…. a ještě si vymyslí další SNASHOT verzi, taky stačí enter, ale pokud by ste třeba chtěli verzi 1.0, ale na to by ste asi taky přišli…. Hotovo release:prepare je za námi.3. takže můžeme release:perform
D:\work\eclipse-ws-2-maven\mmt>mvn release:performA máme releasnuto a připravenou další pracovní SNAPSHOT verzi.
Takhle je to docela triviální, ale ta drbačka než jsem přišel na některé detaily.
Takže seznam věcí na které je potřeba si dát pozor.
- Nastavení developerConnection
- Nastavení deploymentManagmentu tedy repository pro výsledný deploy.
- S 2 souvisí nastavení servers tedu heslo pro vzdálený přístup.
- ‚releasovat‘ se dají zdárně jenom SNAPSHOT verze, aspoň tedy myslím.
September 2, 2007 v 5:19 pm
Zdravím,
děkuji za hezký návod. Musím říci, že -DautoVersionSubmodules=true je pro mně novinkou. Už to máme přidané do našeho celofiremního parent projectu
Jen dodám, že pokud máte connection není nutné vyplňovat developerConnection.
Releasovat jdou samozřejmě i „ostré“ verze (tj. bez SNAPSHOT).
Je dobré oddělovat repository s release a snapshot (snapshotů je po čase strašně moc). Pokud je stejné snapshotRepository a repository, tak se nemusí snapshostRepository v distributionManagement uvádět.
April 14, 2008 v 4:02 pm
Zdar,
je to sice stary clanek, ale dost mi pomohl. Zatim moc nechapu jaky rozdil je mezi snapshot a neshapshot. Taky se pokousim udelat nejaky koncovy balicek, ktery bude obsahojat vsechny jar ktere se v multipomu udelay. Nasel jsem ze to jde pomoci assembly. Problem je ze nevim jak z toho udelat goal ktery bude videt v IDE.