Meer met Maven – Where in the world is Maven 3.2.0?

In elke editie zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Apache Maven om meer inzicht te geven in Maven zelf en de vele beschikbare plugins.

In februari 2014 deed het Apache Maven team een aantal belangrijke mededelingen. Allereerst werd er gemeld dat Maven 2.x de ‘End of Life’-status (EOL) heeft gekregen. Dit betekent dat er op de Maven-2.x branch niet meer verder ontwikkeld zal worden. Vervolgens kwam het bericht van een nieuwe release van Maven, namelijk versie 3.2.1. En nu zullen sommigen zich vast afvragen: wat is er gebeurd met Maven versie 3.2.0?

De grondslag van dit verhaal is de betekentis van de term ‘immutable versions’ en met name vanaf het moment dat versies deze status hebben.

Ik zal beginnen met een klein beetje achtergrondinformatie over het release proces. Dit bestaat bij Apache namelijk uit 2 stappen: stagen en promoten. Tijdens het stagen wordt een project gereleased naar een geïsoleerde repository. Vandaaruit kan het project worden getest. Als de testperiode is verlopen én er voldoende bindende stemmen zijn, dan wordt het project doorgezet naar Maven Central. Echter, als de testperiode wordt afgekeurd, dan wordt deze geïsoleerde repository verwijderd. Vervolgens worden de opgemerkte issues opgelost en begint het proces weer helemaal opnieuw.

Jarenlang betekende dit dat de oorspronkelijke (subversion-) tag verwijderd werd en de release opnieuw uitgevoerd werd met het oorspronkelijke versienummer. Immers, de artifacts waren toch nog niet beschikbaar in Maven Central.  Bijkomend voordeel: voor de gebruikers loopt de versienummering netjes op. Deze werkwijze heeft tot nu toe -bij mijn weten- nooit voor grote problemen gezorgd. Er kan wel een kleine ‘flaw’ geïdentificeerd worden, namelijk dat bij testers verouderde/afgekeurde versies in hun repository achterblijven.  Dit kan natuurlijk voorkomen worden door te testen met een aparte repository of door het achteraf weer op te schonen.

Met de komst van ‘distributed versioning systems’ als Git is de waarde van een versie behoorlijk veranderd. Commits krijgen niet meer een oplopend nummertje zoals subversion. Daarnaast is het verwijderen van tags eigenlijk een no-go, omdat een DVS zich baseert op het clonen van de volledige repository. Aangezien het versienummer standaard deel uitmaakt van de naam van de tag, is het hergebruik van hetzelfde versienummer eigenlijk geen optie meer. Dit heeft tot gevolg dat het versienummer gewoon doorloopt en dat in de centrale repository gaten kunnen ontstaan.

Tot nu toe is gepleit voor het gebruikersgemak, oftewel direct op elkaar volgende versienummers. Zelfs nadat de Maven Core verplaatst werd van Subversion naar Git is dit principe aangehouden, met als gevolg een aantal fikse aanvaringen het Git-puristen. Ondertussen lijkt de tijd rijp om het principe van direct opvolgende versienummers los te laten.

Een manier voor het gebruiken van direct oplopende én unieke versienummers is het toepassen van milestones. Maar dat betekent dat de laatste goedgekeurde milestone nogmaals gereleased moet worden met het definitieve versienummer, welke ook weer getest moet worden. En dat is voor de meeste mensen te omslachtig, helemaal als het zelden voorkomt dat een release wordt afgewezen. Vandaar dat we langzaamaan allemaal moeten accepteren dat het maar een nummertje is en dat versie 3.2.1 een nieuwere is van versie 3.1.1 met minor fixes.

Tot slot nog een aantal opvallende punten uit de releases notes van Maven 3.2.1:

  • Om Maven te draaien, is voortaan minimaal JDK6 vereist. Er kan uiteraard nog steeds gecompileerd worden tegen oudere JDK versies.
  • Voor het encrypten van wachtwoorden is het niet meer nodig om het wachtwoord als plaintext argument mee te geven. Je kunt gebruik maken van de password prompt.
  • De Maven Reactor is sterk verbeterd, waardoor je meer grip kunt krijgen over welke modules van de een multimodule project je wel of juist niet mee wilt nemen in een run.

Een samenvatting van de release notes van Maven 3.2.1 kan gevonden worden op http://maven.staging.apache.org/docs/3.2.1/release-notes.html