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.

4 Respostas

  1. Joao

    Achei seu artigo muito bom mas poderia tirar algumas duvida que estou tendo.
    Se meu projeto tem que estar com fontes publico para poder publicar no maven ?

    Responder
  2. Atila Augusto dos Santos

    Excelente postagem!

    Eu tive problemas com o plugin do maven release por não configurar uma chave ssh de acesso ao github, visto que sempre utilizo https.
    Outra coisa é que não precisei gerar nenhuma tag local pois o comando mvn release:prepare já auxilia com isso só necessário sincronizar com branch remoto.

    E você saberia me dizer como proceder no caso de error 403 no nexus?
    Nexus returned an error: ERROR 403: Forbidden” while releasing

    Responder
    • André Ivo

      Olá Atila,

      sinceramente não sei. Nunca passei por este problema.
      Caso descubra o problema comenta aqui para gente saber como você resolveu.
      Abraço

      Abraço

      Responder

Deixe uma resposta

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.