Blog

Déployer son artifact sur Maven Central

Nous avons tous développé des artifacts Open-Source, et nous avons toujours râlé parce que c’était difficile de les déployer dans Maven Central. Du coup, on met des repository dans nos pom, pour aller indiquer d’où on doit charger nos propres artifacts !

J’ai cherché à le faire, je m’y suis cassé les dents longtemps, et avec beaucoup d’abnégation (si si…), j’y suis arrivé. D’où ma recette pour vous aider !

Pour déployer un artifact Open-source dans Maven Central, ben, c’est pas possible directement ! Il faut passer par un autre dépôt, qui se synchronisera automatiquement avec le central. Personnellement, j’ai choisit http://oss.sonatype.org. Il faut s’y créer un compte. On obtient un login / passwd.

Première opération, déclarer cette authentification dans votre ~/.m2/settings.xml :

 
<settings>
 <servers>
  <server>
   <id>ossrh</id>
   <username>cmarchand</username>
   <password>xxxxxx</password>
  </server>
 </servers>
</settings>

Ensuite, il faudra, pour pouvoir déployer vos artifacts, les signer. Cela se fait sous maven avec l’utilisation d’un plugin, mais cela nécessite l’utilisation – et donc l’installation – de gpg. En fonction de votre OS, allez chercher la doc qui va bien pour installer le produit. Il faudra ensuite vous créer une clé GPG, la déployer sur un serveur : tout est remarquablement expliqué ici ! Je vous recommande une clé sans expiration, pour se simplifier la vie.

Ensuite, votre clé créée, il faut la déclarer dans votre ~/.m2/settings.xml :

<settings>
 <servers ... />
 <profiles>
  <profile>
   <id>ossrh</id>
   <activation>
    <activeByDefault>true</activeByDefault>
   </activation>
   <properties>
    <gpg.executable>gpg2</gpg.executable>
    <gpg.passphrase>xxxx</gpg.passphrase>
   </properties>
  </profile>
 </profiles>
</settings>

Cela vous permettra d’utiliser votre clé pour signer.

Ensuite, il faut aller créer un ticket JIRA sur Jira. Dans le Issue type, sélectionner ‘New project’. Attention, c’est un piège : vous ouvrez un ticket JIRA pour enregistrer la racine de votre groupId (top.marchand en ce qui me concerne), et pas uniquement votre projet ! Ensuite, vous remplissez la suite, en mettant bien la racine de votre groupId dans le champ groupId, et pas le groupId de votre projet. Quand le ticket sera traité (c’est rapide, 48h maxi), vous obtiendrez l’URL des différents repository dans lequel vous pouvez déployer.

Ensuite, votre projet : il y a plein de choses que vous devez impérativement renseigner, sinon votre artifact sera irrémédiablement rejeté :

  • description
  • url
  • scm

Ensuite, il faut définir votre politique de déploiement. Perso, je ne déploie que des release, donc je ne définit rien pour les snapshots, sinon, vous ajoutez un snapshotRepository :

<distributionManagement>
 <repository>
  <id>ossrh</id>
  <url>l'URL renvoyée dans le ticket JIRA</url>
 </repository>
</distributionManagement>

Personnellement, je n’ai pas forcément envie de générer les sources, la javadoc et signer à chaque fois que je package. Donc, je mets tout ça dans un profile !

<profiles>
 <profile>
  <id>release</id>
  <build>
   <plugins>
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-gpg-plugin</artifactId>
     <version>1.6</version>
     <executions>
      <execution>
       <id>sign-artifacts</id>
       <phase>verify</phase>
       <goals>
        <goal>sign</goal>
       </goals>
      </execution>
     </executions>
    </plugin>
    <plugin>
     <groupId>org.sonatype.plugins</groupId>
     <artifactId>nexus-staging-maven-plugin</artifactId>
     <version>1.6.7</version>
     <extensions>true</extensions>
     <configuration>
      <serverId>ossrh</serverId>
      <nexusUrl>https://oss.sonatype.org/</nexusUrl>
      <autoReleaseAfterClose>true</autoReleaseAfterClose>
     </configuration>
    </plugin>
   </plugins>
  </build>
 </profile>
</profiles> 

Après, quand vous avez un truc à déployer, il vous suffit de faire
mvn -Prelease deploy

Et voilà !

Quelques explications, maintenant :
lorsque vous déployez, votre artifact tombe dans un dépôt de staging, où il est contrôlé. Si il ne passe pas les contrôles, il ne pourra qu’être supprimé (vous aurez le nom du dépôt dans les logs).
si vous avez spécifié true, et qu’il passe les contrôles, il sera automatiquement déplacé dans un repository qui est synchronisé avec maven central ; sinon, vous devrez soit en faire une release depuis l’appli web Nexus, soit faire un mvn -Prelease org.sonatype.plugins:nexus-staging-maven-plugin:staging:release.

Bons déploiements !

Christophe Marchand

Written by

The author didnt add any Information to his profile yet