Maven Central: Como publicar sua LIB Java

Precisa publicar sua LIB Java no Maven Cetral e não sabe como? Acho que esse post pode ajudar!

O principal objetivo deste post é descrever o processo de publicação de uma biblioteca/LIB (Library, que será referenciado como LIB) no Maven Central.

Introdução

Todo projeto Java que utiliza o Maven como ferramenta para gerenciamento de dependências, necessita de um repositório para que o Maven possa realizar o download das LIBS.

Para quem não tem um repositório instalado e configurado, o Maven utiliza seu próprio repositório, chamado de Maven Central, que pode ser consultado via browser no link https://search.maven.org/.

O Maven Central é publico e está á disposição de todos que desejarem utilizar. Para isso basta criar um projeto e configurar a LIB que se deseja no arquivo POM.XML.

Mas quando você possui uma LIB importante, e deseja torna-la publica para outras pessoas utilizem? É isso que iremos tentar tratar nesse documento.

Resumo do Passo à Passo

A publicação no Maven Central resume-se a 7 passos:

  1. Solicitar a criação do repositório para Maven no Nexus;
  2. Configurar o POM.xml do seu projeto;
  3. Configurar o arquivo de configuração do Maven Local;
  4. Geração de chave GPG;
  5. Publicar a chave GPG em servidor público;
  6. Publicar os releases;
  7. Aprovar os releases no Nexus;

Pré-requisito/Dica

Antes de iniciar o processo, sugiro uma boa revisão na organização do seu projeto.

Todo seu projeto será referenciado através do seu Group Id. Desta forma fica aqui algumas dicas relevantes com relação à organização e composição do seu Group Id.

O Group Id deve ser um identificador único de tal forma que ninguém mais utilizará o mesmo Group Id que o seu. Isso é importante porque ao tonar o seu projeto público, sabendo que certamente outras pessoas devem querer utilizar o seu projeto, e ao se referenciar a um Group Id duplicado, o seu projeto pode não ser encontrado. Por exemplo:

Imagine que o seu projeto seja um conversor qualquer, o Group Id igual a “conversor” não deve ser uma boa escolha. Outras pessoas podem ter criado algo igual ao seu.

Mesmo que seu projeto não se torne público e não vá utilizar o Maven Central, ainda sim o Group Id é essencial para uma boa organização do seu repositório.

Uma boa prática é utilizar o domínio do seu site (de forma inversa) + o nome do seu projeto separados por ponto. Por exemplo:

URL: www.meusite.com.br

Projeto: conversor de moedas

Group Id: br.com.meusite.conversor.moedas


Para o caso de projetos open source hospedados no GitHub, por convenção coletiva é utilizado com.github.<nome do usuário>.<nome do projeto>. Este padrão é obrigatório para quem deseja publicar seu projeto no Maven Central.

E Artifact Id também é importante para indicar qual nome da LIB.

Em alguns casos é possível suprimir o nome do projeto e informá-lo diretamente no Artifact ID, mas é uma questão de organização e deve ser levado em consideração.

Sobre os diretórios do seu projeto.

Também por convenção coletiva utiliza-se o mesmo padrão Group ID na organização dos diretórios do projeto. Não se trata de uma regra mas ajuda na padronização.

Criação do repositório do Maven

Desde 2010, nenhuma LIB é adicionada diretamente no Maven Central. Para que a publicação seja possível, existem repositórios de terceiros que fazem o trabalho de manter e gerenciar as LIBS, e ainda, sincronizar os releases com o Maven Central.

Os servidores de repositórios aprovados pela Apache Software Foundation são:

  1. Apache Software Foundation: Para todos os projetos apache
  2. FuseSource Forge: Para projetos focados em FUSE
  3. Nuiton.org
  4. Sonatype OSS (Open Source Software): Para projetos Open Source

Para isso, neste post usaremos o Sonatype OSS. Também usaremos GIT (GitHub) como sistema de versionamento. Desta forma estes sistemas serão utilizados como referencia durante os exemplos e explicações.

Para criar o repositório no Sonatype OSS é necessário utilizar o Jira para abrir um chamado e solicitar a criação repositório.

Dica: Jira é um software comercial desenvolvido pela empresa Australiana Atlassian. É uma ferramenta que permite o monitoramento de tarefas e acompanhamento de projetos garantindo o gerenciamento de todas as suas atividades em único lugar. (Wikipedia) https://pt.wikipedia.org/wiki/Jira

Dica: Um Projeto JIRA é um agrupamento de tarefas (Issues), e é definido de acordo com a organização e as suas necessidades. . (Wikipedia) https://pt.wikipedia.org/wiki/Jira

Para a abertura correta do chamado faça:

  1. Acesse o JIRA Sonatype OSS (https://issues.sonatype.org/secure/Signup!default.jspa);
  2. Faça o cadastro do seu login;
  3. Clique no menu Issues;
  4. Clique no botão Create e selecione:
    1. Project: Community Support – Open Source Project Repository Hosting (OSSRH);
    2. Issue Type: New Project;
    3. Summary: Nome do seu projeto
    4. Description: É opcional, mas se for o caso faça uma breve descrição do seu projeto;
    5. Group ID: Deve ser o mesmo do seu projeto. Iremos falar com detalhes sobre isso mais tarde;
    6. URL do seu projeto: Caso seja um projeto do GitHub, indique a página principal do projeto, por exemplo: https://github.com/sonatype/nexus-oss
    7. SCM url: Indica o endereço do seu sistema de versionamento. Por exemplo https://github.com/sonatype/nexus-oss.git
    8. UserName(s): indica os usuários que você deseja que seja capaz de implanter artefatos para este groupid.
    9. Already Synced to Central: Indica se ja foi sincronizado com o Maven Central;
  5. Pressione Create.
  6. Adicione o sumário, que será o nome do seu projeto, o groupId correto e demais dados.

Você deverá receber um e-mail dizendo que seu repositório para o Group Id informado está preparado e pronto para receber o seu projeto; Este e-mail pode demorar em alguns casos até dias. No meu caso foi quase instantâneo.

Preparação do POM.xml do seu projeto

O arquivo POM (Project Object Model) é o arquivo que o Maven utiliza para gerenciar as dependências e todas as configurações do projeto.

Não vou entrar em detalhes de todas as configurações do POM, mas compreender algumas configurações é importante para realizar as publicação no Maven Central.

A seguir serão apresentadas as configurações obrigatórias para o arquivo POM:

1. O Cabeçalho: No cabeçalho são configurados os dados básicos do seu projeto.

<modelVersion>4.0.0</modelVersion>
<groupId>seu.group</groupId>
<artifactId>nome-projeto</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>nome-projeto</name>
<description>Descricao do projeto.</description>
<url>http://url-do-projeto</url>

No Campo groupId defina o mesmo grupo que foi criado no Jira.

2. Parent do arquivo do Maven.

Para quem já utilizou o Maven e repositório sabe da necessidade de configurar as TAGS <distributionManagement>, que define qual o endereço do repositório.

No caso do Maven Central, ao utilizar o Sonatype OSS, esta TAG não é necessária, pois estas informações foram configuradas no arquivo parent. Sendo assim basta apenas incluir a seguinte configuração no POM.

<!-- conf obrigatoria para o Sonatype OSS -->
<parent>
   <groupId>org.sonatype.oss</groupId>
   <artifactId>oss-parent</artifactId>
   <version>7</version>
</parent>

 

3. Defina o endereço do sistema de controle de versão do seu código. Veja exemplo do caso do GitHub.

<scm>
   <connection>scm:git:https://github.com/<usuario>/<projeto>.git</connection>
   <developerConnection>scm:git:https://github.com/<usuario>/<projeto>.git </developerConnection>
   <url>https://github.com/<usuario>/<projeto>.git</url>
</scm>

4. Licença de uso do seu projeto

Defina qual licença de uso será utilizada para o seu sistema.

<!-- exemplo, use conforme a sua licenca -->
<licenses>
   <license>
      <name>Mozilla Public License, Version 2.0</name>
      <url>http://www.mozilla.org/MPL/2.0/index.txt</url>
   </license>
</licenses>

5. Por ultimo defina os dados dos desenvolvedores

<developers>
   <developer>
      <id>apelido</id>
      <name>seu nome</name>
      <email>seu email</email>
      <roles>
         <role>project owner</role>
         <role>administrator</role>
         <role>developer</role>
      </roles>
      <timezone>-3</timezone>
   </developer>
</developers>

O restante do documento POM continua o mesmo.

Preparação do arquivo de configuração do Maven

É necessário indicar ao Maven o usuário e senha para se conectar no Nexus.

Para isso você pode alterar o próprio arquivo do Maven ou criar um novo arquivo chamado settings.xml dentro da pasta ~/.m2/, com o seguinte conteúdo;

<settings>
   <servers>
      <server>
         <id>sonatype-nexus-snapshots</id>
         <username>usuario</username>
         <password>senha</password>
      </server>
      <server>
         <id>sonatype-nexus-staging</id>
         <username>usuario</username>
         <password>senha</password>
      </server>
   </servers>
</settings>

Geração de chave GPG

GNU Privacy Guard (GnuPG or GPG) é uma alternativa Open Source ao aplicativo PGP de criptografia.

PGP, do inglês Pretty Good Privacy (privacidade muito boa), é um programa de computador de encriptação e descriptografia de dados (Criptografia de chave pública) que fornece autenticação e privacidade criptográfica para comunicação de dados. É frequentemente utilizado para assinatura, criptografia e descriptografia de textos, e-mails, arquivos, diretórios e partições inteiras de disco para incrementar a segurança de comunicações via e-mail. Foi desenvolvido por Phil Zimmermann em 1991. (wikipedia = https://pt.wikipedia.org/wiki/PGP)

Os repositórios Maven exigem este tipo de segurança para evitar que os artefatos publicados sejam alterados, por pessoas com intenções maliciosas.

Para gerar uma chave deste tipo é necessário o uso do programa OpenPGP. Para Windows pode-se utilizar gratuitamente o http://www.gpg4win.org/download.html.

  1. Para instalar o programa no Linux execute:
sudo apt-get install gpg

2. Para gerar a chave

gpg –gen-key

3. Informe o seu nome (ou apelido), email e demais confirmações (sugiro deixar os padrões). Não esqueça a senha.

4. Para visualizar o par de chave criado:

gpg –list-keys

Enviar a chave GPG para um servidor público;

Para que sua chave possa ser utilizada pelo Maven, é necessário que sua chave seja enviada a um servidor público.

Existem vários servidores que estão sincronizados entre sí, desta forma basta publicar em apenas um deles e sua chave será replicada para todos os outros.

Para exportar, você precisa conhecer o seu KEY-ID gerado.

Execute o comando gpg –list-keys. A saída será algo parecido com:


/home/andre.ivo/.gnupg/pubring.gpg
----------------------------------
pub 2048R/659CA01A 2017-01-06
uid André Ivo andre.ivo@gmail.com
sub 2048R/256845D5 2017-01-06

No exemplo acima, a KEY-ID é 659CA01A. Você pode exportar a chave com o comando:

 
gpg –export -a 659CA01A > mykey.asc.

O arquivo gerado conterá internamente a base64 da sua chave pública. Abra o arquivo em qualquer editor de texto e verá algo como isso:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
mQENBFhvxyQBCACST54nK+wRojSyCCuVNKxQYLg+Hlnrq9Ue8XpXLv4RskfDozeG
W370IGxG2wT8Ir/KHe+juHBWsO1UFXBIAEJe5xlRcGZZoxIN4QkvhQVhkpkDChu8
n/VTtBPiPlqc8ZOEzHnmAuMhdDOLQKnbLwkVX/+Yb94MolFL+bw7tXNhb5ggm/VS
ArSmv7IM0l2anfN17dA5ODdmTftjU/X2Wj3WL9sD/knhFMNdjGZJQqvFA+C1WQFl
iazcWJM+rsbkdDN6k1wJ8eD7YhwCYsDGNRSQzqNKMYU51b0v8GcEY+42hjWRjM1K
EsZjaMgYTJJ2qaDxBSRVoaGE1jqZgh6X1LkhdGkQJVGxrAA4dPlOi8zSCrdECVzO
FqAhrapZ1OyzGkwaN8u0eHDih5BuBE7GhI5pKZ3fgM18QkbQB7dkib2D4iPkfdXb
osMvEXCtyo0Qe/jMdPQfEF+vj9OibOxdABEBAAGJAR8EGAECAAkFAlhvxyQCGwwA
CgkQTkyQMWWcoBpjMAf/f+KBn+5KuSAssHSAKC78VzjKtBXbLEb7xkIAYJI2dYYm
btqZHrKRLtPziI9cutIB6FM9xxC3docZxIRZ3p13xLClHQZuI7dyct1iGQGGwrxI
RLOnwCZXS39JBYv8aDe8XpibcB3KS58lJpAddBvRzLJKeZCnHteqHc7qRhdG9w0U
GUoZ08eqXMgKph5YneUwNyR3nYAM9B4kiaIA1bgoQgyein6p6FL8F195E/4nxvne
wuHEOrv4BYGEKLZK0awfEmcOkCQe8CtwkATYo9QK6BsojxUHozVROKY0fizerYUA
v2r/GCNLv2zfg9WYIfb8eGN9AA0jf2+m3EhJVNpkOA==
=Cl6b
-----END PGP PUBLIC KEY BLOCK-----

Acesse o site http://pgp.mit.edu e copie toda a chave acima, incluindo os comentários, no campo “Submit a key” e envie a chave.

Publicar os releases;

Por padrão o Maven acessa o seu repositório e comita todas as alterações. Quando o repositório de artefatos está em um local remoto, esta funcionalidade não é recomendada, pois pode falhar durante o processo de geração do seu release.

Para resolver isso altere o POM.xml para que o Maven não realize os comites. Faça como no exemplo:

<build>
   <plugins>
   (...)
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-release-plugin</artifactId>
         <version>2.5.3</version>
         <configuration>
            <pushChanges>false</pushChanges>
         </configuration>
      </plugin>
   (...)
   </plugins>
</build>

Para realizar a publicação faça:

  1. Garanta que todas as suas alterações foram enviadas para o Github;
git add –A .
git commit
git push

2. Limpe os diretórios para a publicação; neste comando serão solicitados informações sobre o projeto;

mvn release:clean

3. Prepare seu projeto para a publicação;

mvn release:prepare

4. Gere uma TAG para o Git e Comite as alterações

git push --tags 
git push

5. Para ver a TAG gerada

git tag

6. Envie suas alterações para o repositório (Maven Central). Neste comando será solicitado a senha da sua chave GPG.

mvn release:perform

7. Por fim, execute novamente o git push para enviar todas as alterações que o Maven fez, incluindo a TAG, para o Github.

 

Nos poucos manuais que encontrei na internet, existem casos que indicam ser necessário mais um passo. Solicitar que a Sonatype OSS seja sincronizado.

Para isso volte ao JIRA, acesse sua conta e selecione a issue original de criação do repositório. Para isso selecione o menu Issues, Reported by me. Adicione um comentário solicitando a sincronização do repositório.

Promover os releases no Nexus;

Ao enviar seu artefato ele estará disponível na opção de repositório temporário (Staging Repositories). Para ele ficar público e torná-lo disponível, você precisa promover o artefato para Release. Para isso faça:

  1. Acesse o Sonartype OSS (https://oss.sonatype.org);
  2. Faça o login;
  3. Selecione o menu Staging Repositories;
  4. Encontre o seu repositório. O nome deve deve ser o mesmo que o seu GroupID. No meu caso ele era o ultimo da lista;
  5. Selecione o repositório. Ele deve estar aberto (“open”);
  6. Clique no botão de fechar (“close”) na barra superior. A aba “Content” irá sumir e verifique que nas atividades (“activity”) o fechamento ocorreu com sucesso. Se tudo ocorrer como esperado, você receberá um e-mail automático em poucos minutos indicando “Staging Completed”;
  7. Clique no botão “Refresh” e veja que o seu repositório está fechado;
  8. Selecione-o novamente e clique em “Release”. Se der tudo certo novamente, você receberá outro e-mail automático indicando “Promotion Completed”.

 

Como mencionado anteriormente, existem casos que indicam ser necessário mais um passo. Solicitar que a Sonatype OSS seja sincronizado.

Para isso volte ao JIRA, acesse sua conta e selecione a issue original de criação do repositório. Para isso selecione o menu Issues, Reported by me. Adicione um comentário solicitando a sincronização do repositório.

E pronto!!! Finalmente sua LIB estará disponível para que a comunidade possa usufruir!

Abraço!

Sobre o Autor

Graduado em Engenharia da Computação pela Universidade do Vale do Paraíba(2006), MBA em Gestão de Projetos pela Fundação Getúlio Vargas(2010) e Mestrado em Engenharia e Tecnologias Espaciais na área de Engenharia e Gerenciamento de Sistemas Espaciais pelo INPE(2013). Possuí experiência na área de Ciência da Computação e Engenharia da Computação, com ênfase em Engenharia de Software, Sistemas bancos de dados e automação.
É um grande apaixonado por tecnologia e assuntos relacionados.

Deixe uma resposta

Seu endereço de email não será publicado.