Introduction
Depuis Maven 3+ il est possible d'écrire des pom en autre chose que du XML, entre autres : Yaml, JSON, Groovy, Scala, Clojure et Ruby sont aussi de la partie. Nous allons voir comment écrire un POM en Yaml.
Fonctionnement
Nous allons nous appuyer sur le mécanisme d'extensions de Maven 3+. En effet, avant de lire un fichier POM, Maven va d'abord lire le contenu du fichier .mvn/extensions.xml et c'est dans ce dernier que nous allons déclarer l'extention polyglot-yaml qui va nous permettre de rédiger un fichier pom.yml à la place d'un pom.xml.
Mise en oeuvre
- À la racine de votre projet créez le répertoire .mvn/.
- Créez dans ce répertoire le fichier
extensions.xml
dont le contenu sera le suivant :<?xml version="1.0" encoding="UTF-8"?> <extensions> <extension> <groupId>io.takari.polyglot</groupId> <artifactId>polyglot-yaml</artifactId> <version>0.2.1</version> </extension> </extensions>
- Créez un fichier pom.yml à la racine de votre projet et voilà.
À quoi ressemble un pom en Yaml ?
La syntaxe Yaml change un petit peu la structure du pom. En voici un exemple permettant de compiler une application Java :
modelEncoding: 'UTF-8'
modelVersion: '4.0.0'
groupId: 'com.itametis.demo'
artifactId: 'demo-project'
version: '1.0.0-SNAPSHOT'
packaging: 'jar'
name: 'My project'
properties:
## Project encoding
project.encoding: 'UTF-8'
project.build.sourceEncoding: '${project.encoding}'
project.reporting.outputEncoding: '${project.encoding}'
## Maven compiler
maven.compiler.source: '1.8'
maven.compiler.target: '${maven.compiler.source}'
# Exemple de déclaration d'une section module
# fournie à titre d'exemple ici
#modules:
# - demo-submodule-1
# - demo-submodule-2
dependencies:
## Testing dependencies
- { groupId: 'org.assertj', artifactId: 'assertj-core', version: '3.8.0', scope: 'test' }
- { groupId: 'org.junit.platform', artifactId: 'junit-platform-runner', version: '1.0.1', scope: 'test' }
- { groupId: 'org.mockito', artifactId: 'mockito-core', version: '2.12.0', scope: 'test' }
build:
plugins:
- artifactId: 'maven-compiler-plugin'
groupId: 'org.apache.maven.plugins'
version: '3.6.2'
configuration:
compilerArgs: {arg: '-Werror'}
encoding: '${project.build.sourceEncoding}'
fork: true
debug: false
optimize: true
showDeprecation: true
showWarnings: true
source: '${maven.compiler.source}'
target: '${maven.compiler.target}'
En cas d'héritage
En cas d'héritage, il vous faudra définir le parentPath dans le pom enfant. En voici un exemple :
parent:
groupId: 'com.itametis.demo'
artifactId: 'demo-project'
version: '1.0.0-SNAPSHOT'
relativePath: '../pom.yml'
Quelques limitations
Il n'existe pas encore de moyen à cette heure (cf. date de rédaction de cet article) pour utiliser le maven-release-plugin sur un POM qui ne soit pas en XML, ce qui complique le processus de release.