Thématiques principales

lundi 12 février 2018

Maven : Management

Un petit article pour comprendre quelques subtilités dans l’utilisation de maven et des éléments de build qui se finissent par Management.

En effet lorsque l’on construit ses poms, on a souvent besoin de définir certaines modalités particulieres des builds. Pour cela, on utilise des plugins. De la même façon lorsque l’on veut utiliser un composant, il est nécessaire de déclarer une dépendance à ce composant. Dans les deux cas la déclaration de ces éléments, une fois réalisé, est immuable.

Ainsi quoiqu’il arrive que la définition soit faites dans le pom parent ou dans le pom cible, lors du build, les éléments seront appelés tel quel moyennant les éventuelles surcharges mais il seront appelés.

En utilisant les éléments Management, c’est a dire dependencyManagement [1] ou pluginManagement [2], maven nous permet de définir des configurations potentiellement utilisables dans les poms enfants.

Par exemple dans un pom parent, en déclarant:


<dependencyManagement>
 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.10</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.mockito</groupId>
   <artifactId>mockito-all</artifactId>
   <version>1.9.5</version>
   <scope>test</scope>
  </dependency>
 </dependencies>
</dependencyManagement>


nous permet de déclarer dans notre pom cible:


<dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
 </dependency>
 <dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
 </dependency>
</dependencies>


sans avoir à déclarer une version particulière, celle ci étant celle donnée dans le pom parent et donc considérée comme préconisé.

Et rien n'empêche de déclarer une autre version, si l’on se sent suffisamment à l’aise pour assumer les éventuels conflits.

De la meme maniere, on pourra factoriser divers phases de builds que l’on appelera ou precisera selon le besoin dans les pom fils.

Par exemple un pom fils declarera de facon tres minimaliste:


<plugins>
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
     <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
    </archive>
   </configuration>
 </plugin>
 <plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
 </plugin>
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
 </plugin>
 <plugin>
  <artifactId>jdeb</artifactId>
  <groupId>org.vafer</groupId>
 </plugin>
</plugins>


alors que la définition des configurations de ces plugins est juste un peu plus complexe:


<pluginManagement>
<plugins>
 <plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <version>2.3.7</version>
  <extensions>true</extensions>
  <configuration>
   <instructions>
    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
    <Bundle-Name>${project.name}</Bundle-Name>
    <Bundle-Version>${project.version}</Bundle-Version>
    <Bundle-Vendor>TC</Bundle-Vendor>
   </instructions>
  </configuration>
  <executions>
   <execution>
    <id>bundle-manifest</id>
    <phase>process-classes</phase>
    <goals>
     <goal>manifest</goal>
    </goals>
   </execution>
  </executions>
 </plugin>
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.3.1</version>
  <configuration>
   <archive>
    <manifest>
     <addClasspath>true</addClasspath>
     <classpathPrefix>./</classpathPrefix>
    </manifest>
    <manifestEntries>
     <Class-Path>./ ./${project.artifactId}-${project.version}/</Class-Path>
    </manifestEntries>
   </archive>
  </configuration>
  <executions>
   <execution>
    <id>assembly</id>
    <phase>prepare-package</phase>
    <goals>
     <goal>jar</goal>
    </goals>
    <configuration>
     <classifier>assembly</classifier>
     <includes>
      <include>**/*.class</include>
      <include>**/*.properties</include>
      <include>**/*-context.xml</include>
     </includes>
    </configuration>
   </execution>
  </executions>
 </plugin>
 <plugin>
  <artifactId>jdeb</artifactId>
  <groupId>org.vafer</groupId>
  <version>1.5</version>
  <executions>
   <execution>
    <phase>package</phase>
    <goals>
     <goal>jdeb</goal>
    </goals>
    <configuration>
     <deb>${project.build.directory}/${project.artifactId}-${build}_${versiontimestamp}_all.deb</deb>
     <verbose>true</verbose>
     <controlDir>${project.build.directory}/${project.artifactId}-${project.version}/DEBIAN</controlDir>
     <dataSet>
      <data>
       <src>${project.build.directory}/${project.artifactId}-${project.version}/opt</src>
       <type>directory</type>
       <mapper>
        <type>perm</type>
        <prefix>/opt</prefix>
       </mapper>
      </data>
     </dataSet>
    </configuration>
   </execution>
  </executions>
 </plugin>
 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.5.3</version>
  <configuration>
   <appendAssemblyId>true</appendAssemblyId>
   <attach>true</attach>
   <finalName>${project.artifactId}-${project.version}</finalName>
   <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
   <outputDirectory>${project.build.directory}</outputDirectory>
   <archive>
    <manifest>
     <addClasspath>true</addClasspath>
     <classpathPrefix>./</classpathPrefix>
    </manifest>
   </archive>
  </configuration>
  <executions>
   <!-- Packaging debian -->
   <execution>
    <id>assembly-debian</id>
    <phase>prepare-package</phase>
    <goals>
     <goal>single</goal>
    </goals>
    <configuration>
     <appendAssemblyId>false</appendAssemblyId>
     <descriptors>
      <descriptor>src/main/assembly/assembly-debian.xml</descriptor>
     </descriptors>
    </configuration>
   </execution>
   <execution>
    <id>assembly-targz</id>
    <phase>package</phase>
    <goals>
     <goal>single</goal>
    </goals>
    <configuration>
     <appendAssemblyId>false</appendAssemblyId>
     <descriptors>
      <descriptor>src/main/assembly/assembly-targz.xml</descriptor>
     </descriptors>
    </configuration>
   </execution>
  </executions>
 </plugin>
</plugins>
</pluginManagement>


Mais cela revient a déclarer ce qu'il aurait de toute façon du être déclaré dans tous les pom fils (donc de multiple fois)

References:

[1] https://maven.apache.org/pom.html#Dependency_Management
[2] https://maven.apache.org/pom.html#Plugin_Management

Aucun commentaire:

Enregistrer un commentaire