maven-release-plugin in Action
28.8.2007 (Tuesday)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.