Column Maven: Pom.noxml

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.

Ook tijdens JavaOne werd ik regelmatig geconfronteerd met de verschillen tussen Maven en Gradle. De tools hebben een verschillende visie en dat is prima: gebruik de tool die het meest geschikt is voor jouw situatie. Vaak wordt als meest belangrijke verschil genoemd dat Gradle geen xml formaat gebruikt voor zijn build file. Voor het gros van de Maven gebruikers is xml nooit een probleem geweest, maar voor wie dit het enige argument is om van Maven af te stappen, zal ik eens uitleggen hoe je Maven kunt gebruiken zonder xml.

Maven heeft het principe van “convention over configuration”. Dit betekent dat gebruik gemaakt wordt van zinvolle defaults daar waar mogelijk, maar dat deze ook aangepast kunnen worden. Dat geldt ook voor de pom.xml. Takari, het bedrijf van Maven oprichter Jason van Zyl, heeft een project genaamd Polyglot-Maven. Daarmee is het mogelijk gebruik te maken van een ander pom formaat.

Je voegt het volgende bestand toe aan de hoofdfolder van je project:

 


.mvn/extensions.xml

<?xml version="1.0" encoding="UTF-8"?> <extensions> <extension> <groupId>io.takari.polyglot</groupId> <artifactId>ARTIFACTID</artifactId> <version>0.1.10</version> </extension> </extensions>

 

Op https://github.com/takari/polyglot-maven#available-languages kun je de juiste ARTIFACTID waardes vinden.

Hieronder 2 gelijke pom files, echter een geschreven in het bekende xml-formaat, de andere in atom.

 

pom.xml

<project>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>

  <artifactId>my-module</artifactId>

  <version>1.0.0-SNAPSHOT</version>

  <name>My Module</name>

</project>

 


 

pom.atom

project "My Module" @ "" as jar id: com.mycompany.app:my-module:1.0.0-SNAPSHOT

Voor het vertalen van het ene pom-formaat naar de andere heeft Takari ook een maven-plugin geschreven, dat je in dit geval als volgt kunt gebruiken:

 


mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.xml -Doutput=pom.atom

 

Wees je ervan bewust welke prijs je hiervoor betaald. Er zal geen IDE support zijn en daarnaast wordt de pom (nog) niet terug vertaald naar een xml voor ‘install’ en ‘deploy’. Voor library-development is dit derhalve niet een gewenste oplossing.

Daarnaast is het toevoegen van een een .mvn map met extensions een feature die beschikbaar is sinds Maven 3.3.1, dus dit is de minimaal vereiste versie om te werken met andere p