Publié le 10/01/2017, rédigé par Davy CLAISSE

Maven

Comment utiliser des POM en Yaml avec Maven ?

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

  1. À la racine de votre projet créez le répertoire .mvn/.
  2. 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>
  3. 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.