Hospedando um repositório Maven no github

312

Eu tenho um garfo de uma pequena biblioteca de código aberto na qual estou trabalhando no github. Gostaria de disponibilizá-lo a outros desenvolvedores via maven, mas não quero executar meu próprio servidor Nexus e, por ser um fork, não posso implantá-lo facilmente no oss.sonatype.org.

O que eu gostaria de fazer é implantá-lo no github para que outros possam acessá-lo usando o maven. Qual é a melhor forma de fazer isso?

empapar
fonte
5
Quais problemas de licenciamento você enfrenta no OSS Sonatype? Apenas curioso, já que eu mesmo o uso.
Archimedes Trajano
5
Existe uma ferramenta que permite expor seu repositório do GitHub via maven diretamente. jitpack.io stackoverflow.com/a/28483461/3975649
metrimer
1
O Github também anunciou um registro de pacote que suporta o maven. Actualmente no público-beta: github.com/features/package-registry
Kaan

Respostas:

484

A melhor solução que consegui encontrar consiste nestas etapas:

  1. Crie uma ramificação chamada mvn-repopara hospedar seus artefatos de maven.
  2. Use o github site-maven-plugin para enviar seus artefatos ao github.
  3. Configure o maven para usar seu controle remoto mvn-repocomo um repositório do maven.

Há vários benefícios em usar essa abordagem:

  • Os artefatos do Maven são mantidos separados da sua fonte em uma ramificação separada chamada mvn-repo, assim como as páginas do github são mantidas em uma ramificação separada chamada gh-pages(se você usar páginas do github)
  • Ao contrário de outras soluções propostas, ele não entra em conflito com o seu, gh-pagesse você estiver usando-o.
  • Associa-se naturalmente ao destino de implantação, para que não haja novos comandos de preparação para aprender. Basta usar mvn deploycomo faria normalmente

A maneira típica de implantar artefatos em um repositório de remessa remota é usar mvn deploy, então vamos corrigir esse mecanismo para esta solução.

Primeiro, diga ao maven para implantar artefatos em um local temporário de teste dentro do diretório de destino. Adicione isto ao seu pom.xml:

<distributionManagement>
    <repository>
        <id>internal.repo</id>
        <name>Temporary Staging Repository</name>
        <url>file://${project.build.directory}/mvn-repo</url>
    </repository>
</distributionManagement>

<plugins>
    <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.1</version>
        <configuration>
            <altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
        </configuration>
    </plugin>
</plugins>

Agora tente correr mvn clean deploy. Você verá que ele implantou seu repositório maven target/mvn-repo. O próximo passo é fazer o upload desse diretório para o GitHub.

Adicione suas informações de autenticação para ~/.m2/settings.xmlque o github site-maven-pluginpossa enviar para o GitHub:

<!-- NOTE: MAKE SURE THAT settings.xml IS NOT WORLD READABLE! -->
<settings>
  <servers>
    <server>
      <id>github</id>
      <username>YOUR-USERNAME</username>
      <password>YOUR-PASSWORD</password>
    </server>
  </servers>
</settings>

(Como observado, certifique-se de chmod 700 settings.xmlgarantir que ninguém possa ler sua senha no arquivo. Se alguém souber como fazer o site-maven-plugin solicitar uma senha em vez de exigi-la em um arquivo de configuração, informe-me.)

Em seguida, informe o GitHub site-maven-pluginsobre o novo servidor que você acabou de configurar, adicionando o seguinte ao seu pom:

<properties>
    <!-- github server corresponds to entry in ~/.m2/settings.xml -->
    <github.global.server>github</github.global.server>
</properties>

Por fim, configure o site-maven-pluginupload do seu repositório temporário de armazenamento temporário para sua mvn-repofilial no Github:

<build>
    <plugins>
        <plugin>
            <groupId>com.github.github</groupId>
            <artifactId>site-maven-plugin</artifactId>
            <version>0.11</version>
            <configuration>
                <message>Maven artifacts for ${project.version}</message>  <!-- git commit message -->
                <noJekyll>true</noJekyll>                                  <!-- disable webpage processing -->
                <outputDirectory>${project.build.directory}/mvn-repo</outputDirectory> <!-- matches distribution management repository url above -->
                <branch>refs/heads/mvn-repo</branch>                       <!-- remote branch name -->
                <includes><include>**/*</include></includes>
                <repositoryName>YOUR-REPOSITORY-NAME</repositoryName>      <!-- github repo name -->
                <repositoryOwner>YOUR-GITHUB-USERNAME</repositoryOwner>    <!-- github username  -->
            </configuration>
            <executions>
              <!-- run site-maven-plugin's 'site' target as part of the build's normal 'deploy' phase -->
              <execution>
                <goals>
                  <goal>site</goal>
                </goals>
                <phase>deploy</phase>
              </execution>
            </executions>
        </plugin>
    </plugins>
</build>

O mvn-reporamo não precisa existir, ele será criado para você.

Agora corra mvn clean deploynovamente. Você deve ver o maven-deploy-plugin "carregar" os arquivos para o repositório de temporariedade local no diretório de destino e, em seguida, o site-maven-plugin comprometendo esses arquivos e enviando-os para o servidor.

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building DaoCore 1.3-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
[INFO] --- maven-deploy-plugin:2.5:deploy (default-deploy) @ greendao ---
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.jar (77 KB at 2936.9 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.pom (3 KB at 1402.3 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/maven-metadata.xml (768 B at 150.0 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/maven-metadata.xml (282 B at 91.8 KB/sec)
[INFO] 
[INFO] --- site-maven-plugin:0.7:site (default) @ greendao ---
[INFO] Creating 24 blobs
[INFO] Creating tree with 25 blob entries
[INFO] Creating commit with SHA-1: 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] Updating reference refs/heads/mvn-repo from ab7afb9a228bf33d9e04db39d178f96a7a225593 to 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.595s
[INFO] Finished at: Sun Dec 23 11:23:03 MST 2012
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------

Visite github.com no seu navegador, selecione a mvn-reporamificação e verifique se todos os seus binários estão lá.

insira a descrição da imagem aqui

Parabéns!

Agora você pode implantar seus artefatos inventados no repositório público de um pobre simplesmente executando mvn clean deploy.

Há mais uma etapa que você deseja executar, que é configurar todos os poms que dependem do seu pom para saber onde está o seu repositório. Adicione o seguinte trecho ao pom de qualquer projeto que dependa do seu projeto:

<repositories>
    <repository>
        <id>YOUR-PROJECT-NAME-mvn-repo</id>
        <url>https://github.com/YOUR-USERNAME/YOUR-PROJECT-NAME/raw/mvn-repo/</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

Agora, qualquer projeto que exija seus arquivos jar os fará o download automaticamente do seu repositório github maven.

Edit: para evitar o problema mencionado nos comentários ('Erro ao criar confirmação: solicitação inválida. Para' properties / name ', nil não é uma string.'), Certifique-se de indicar um nome em seu perfil no github.

empapar
fonte
25
Observe também que esta solução substituirá seus artefatos anteriores toda vez que você implantar. Isso é apropriado para repositórios de captura instantânea, mas não para artefatos liberados. Para desativar esse comportamento, defina <merge>true</merge>na configuração do site-maven-plugin. Se você fizer isso, acho que terá que criar manualmente o ramo mvn-repo no github e excluir todos os seus arquivos da primeira vez.
emmby
13
+1 inteligente e bem apresentado. Minha única crítica é que você não incluiu um link para o site de plugins do Maven: github.com/github/maven-plugins . Thx Eu estava procurando uma maneira de publicar meu site Maven no github!
Mark O'Connor
7
Essa abordagem não funciona quando a autenticação de dois fatores é usada no github. Veja minha nota na edição aqui: github.com/github/maven-plugins/issues/36#issuecomment-31005606
Dag
18
Para fazer isso funcionar em projetos com vários módulos , você também pode simplesmente usar <altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository>com o maven-deploy-plugin e <outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>com o site-maven-plugin . Isso implementará todos os artefatos no projeto raiz ("pai") e os enviará para o respectivo diretório pai no github. Caso contrário, a compilação de cada sub-módulo irá substituir a do sub-módulo construído antes ...
sd
7
Duas sugestões que o fazem funcionar (pelo menos para mim): Defina a versão atual do plugin Github (no momento seria 0,11). Também sugiro que todos usem um token OAUTH em vez da senha. Você pode gerá-lo em 'Configurações-> Aplicativos-> Tokens de Acesso Pessoal'. Você também pode incorporá-lo no POM via e armazenar o token como variável de ambiente. <github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
Florian Loch
120

Não use o GitHub como um repositório Maven.

Editar: Esta opção recebe muitos votos negativos, mas não há comentários sobre o porquê. Esta é a opção correta, independentemente dos recursos técnicos para realmente hospedar no GitHub. A hospedagem no GitHub está errada por todos os motivos descritos abaixo e sem comentários, não posso melhorar a resposta para esclarecer seus problemas.

Melhor opção - colabore com o projeto original

A melhor opção é convencer o projeto original a incluir suas alterações e ficar com o original.

Alternativa - Mantenha seu próprio garfo

Como você bifurcou uma biblioteca de código-fonte aberto e seu fork também é de código-fonte aberto, você pode carregá-lo no Maven Central (leia o Guia para fazer upload de artefatos no Repositório Central ), dando a ele um novo groupIde talvez um novo artifactId.

Considere esta opção apenas se estiver disposto a manter essa bifurcação até que as alterações sejam incorporadas ao projeto original e, em seguida, você deve abandoná-la.

Realmente considere seriamente se um garfo é a opção certa. Leia os inúmeros resultados do Google para 'por que não bifurcar-se'

Raciocínio

Inchaço no seu repositório com jars aumenta o tamanho do download sem nenhum benefício

Um jar é um outputde seu projeto, pode ser regenerado a qualquer momento a partir dele inputse seu repositório do GitHub deve conter apenas inputs.

Não acredita em mim? Em seguida, verifique os resultados do Google para 'não armazene binários no git' .

Ajuda do GitHub Trabalhar com arquivos grandes diz a mesma coisa. É certo que os jars não são grandes, mas são maiores que o código-fonte e, uma vez que um jar foi criado por uma versão, eles não têm mais motivos para serem versionados - é para isso que serve uma nova versão.

Definir várias repositórios no pom.xml diminui sua compilação por Número de repositórios vezes Número de artefatos

Stephen Connolly diz :

Se alguém adicionar seu repositório, eles afetam o desempenho da compilação, pois agora eles têm outro repositório para verificar artefatos ... Não é um grande problema se você precisar adicionar apenas um repositório ... Mas o problema aumenta e a próxima coisa que você conhece é o maven build está verificando 50 repositórios para cada artefato e o tempo de construção é um cachorro.

Está certo! O Maven precisa verificar todos os artefatos (e suas dependências) definidos em seu pom.xml em relação a cada Repositório que você definiu , pois uma versão mais recente pode estar disponível em qualquer um desses repositórios.

Experimente você mesmo e sentirá a dor de uma construção lenta.

O melhor local para artefatos é no Maven Central, pois é o local central para os frascos, e isso significa que sua construção só verificará um local.

Você pode ler um pouco mais sobre repositórios na documentação do Maven em Introdução aos repositórios

Namorado
fonte
3
Concordo totalmente e faz sentido para os garfos que você deseja manter por um tempo. Mas isso pode ser uma sobrecarga para apenas um pequeno patch para um projeto existente.
emmby
5
Duvido que o Github tenha um problema, pois eles escreveram o plugin que habilita esse recurso. Concordo que é menos do que ideia, mas c'est la vie.
Phy6
4
Nem sempre é possível implantar um projeto de código aberto no Sonatype. Por exemplo, quando o seu projeto depende de outro projeto de código aberto que ainda não foi implantado (e não pode ser implantado porque não atende aos requisitos do tipo de som).
Gab
1
@ Gab, então sua dependência não é realmente de código aberto. Você deve entrar em contato com o outro projeto, explicar isso e pedir que eles consertem seu licenciamento. (Sun era um culpado deste comportamento no passado)
Bae
1
@ Bae Não é uma questão de licenciamento. Alguns proprietários do projeto decidem não publicar na central simplesmente porque não é sua prioridade. Seu caminho não é possível no mundo real. Se você deseja testar: convença-o a publicar no Central code.google.com/p/sd-dss . É um grande projeto Open Source financiado pela comunidade UE :)
Gab
48

Você pode usar o JitPack (gratuito para repositórios públicos do Git) para expor seu repositório do GitHub como um artefato do Maven. É muito fácil. Seus usuários precisariam adicionar isso ao pom.xml:

  1. Adicionar repositório:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. Adicionar dependência:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

Como respondido em outro lugar, a idéia é que o JitPack construa seu repositório GitHub e atenda aos frascos. O requisito é que você tenha um arquivo de compilação e uma versão do GitHub.

O bom é que você não precisa lidar com a implantação e os uploads. Como você não deseja manter seu próprio repositório de artefato, é uma boa opção para suas necessidades.

Andrejs
fonte
O JitPack é muito bom, mas obriga você a alterar todos os groupId que você tem por perto. Eles dizem que isso pode ser evitado, mas requer que você adicione uma entrada ao DNS da sua empresa, o que é totalmente impraticável na maioria dos casos. Estive tentando com o JP uma vez, então decidi que isso é estúpido demais para seguir em frente.
Zakmck 22/09/2015
1
Alterar o groupId de seus projetos não é necessário. Você ainda pode instalar esses projetos usando o groupId 'com.github.User'. Mas talvez o seu caso de uso seja diferente.
Andrejs
Sim, é muito. Porque eu já tenho dezenas deles em torno da minha organização e usuários externos e porque quero minha própria marca neles. Como alguém pode ser tão tolo tentando me forçar a entrar em seu próprio grupo - é uma das coisas pelas quais estou pensando em mudar de carreira.
Zakmck 22/09
Além disso, não vejo nenhuma necessidade real de os funcionários do JP lançarem esse requisito para mim (eles podem apenas interceptar solicitações do Maven nas especificações do repositório).
Zakmck 22/09
1
Boa ideia, eu fiz isso: github.com/jitpack/jitpack.io/issues/209 , graças :-)
zakmck
9

Outra alternativa é usar qualquer hospedagem na web com suporte a webdav. Você precisará de algum espaço para isso em algum lugar, é claro, mas é simples de configurar e uma boa alternativa para executar um servidor nexus completo.

adicione isso à sua seção de construção

     <extensions>
        <extension>
        <artifactId>wagon-webdav-jackrabbit</artifactId>
        <groupId>org.apache.maven.wagon</groupId>
        <version>2.2</version>
        </extension>
    </extensions>

Adicione algo assim à sua seção de distribuição

<repository>
    <id>release.repo</id>
    <url>dav:http://repo.jillesvangurp.com/releases/</url>
</repository>

Por fim, certifique-se de configurar o acesso ao repositório em settings.xml

adicione isso à sua seção de servidores

    <server>
        <id>release.repo</id>
        <username>xxxx</username>
        <password>xxxx</password>
    </server>

e uma definição para sua seção de repositórios

            <repository>
                <id>release.repo</id>
                <url>http://repo.jillesvangurp.com/releases</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>

Finalmente, se você possui alguma hospedagem php padrão, pode usar algo como sabredav para adicionar recursos ao webdav.

Vantagens: você tem seu próprio repositório maven Desvantagens: você não possui nenhum recurso de gerenciamento no nexus; você precisa de alguma configuração de webdav em algum lugar

Jilles van Gurp
fonte
9

Desde 2019, agora você pode usar a nova funcionalidade chamada registro de pacotes do Github .

Basicamente, o processo é:

  • gerar um novo token de acesso pessoal nas configurações do github
  • adicione informações de repositório e token em seu settings.xml
  • implantar usando

    mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token  
Ruslan López
fonte
A partir de 2019, esta é a melhor opção.
HRJ 07/12/19
1
Mas, para usá-lo por outra pessoa, parece que ele precisa definir o settings.xml com o respectivo URL e informações de autenticação
hemu
Muito estranho ... Você cria seu pacote público, mas outras pessoas precisam de autenticação antes de obtê-lo
Amerousful
No entanto, para contratos privados, após certos usos / mês, o preço entra em cena
Lokeshwar Tailor
8

Como alternativa, o Bintray fornece hospedagem gratuita de repositórios maven. Essa é provavelmente uma boa alternativa ao Sonatype OSS e ao Maven Central se você absolutamente não quiser renomear o groupId. Mas, pelo menos, faça um esforço para integrar suas alterações upstream ou renomear e publicar na Central. Isso facilita muito o uso do garfo por outras pessoas.

Guillaume
fonte
3
Eu não podia acreditar quando tentei, mas o Bintray não suporta instantâneos. Sem utilidade.
Zakmck 22/09/2015
6
Não é mais gratuito. US $ 150 por mês.
AndroidDev 6/10/16
Eu acho que é taxa para projetos de software de código aberto: jfrog.com/open-source
iBiber
0

Se você tiver apenas aarou jararquivo em si, ou simplesmente não quer usar plugins - Eu criei um script shell simples . Você pode conseguir o mesmo: publicar seus artefatos no Github e usá-lo como repositório público do Maven.

Orest Savchak
fonte