O que exatamente é um instantâneo do Maven e por que precisamos dele?

850

Estou um pouco confuso sobre o significado de um instantâneo Maven e por que construímos um?

meisam
fonte

Respostas:

1013

Uma versão de instantâneo no Maven é aquela que não foi lançada.

A idéia é que, antes que um 1.0release (ou qualquer outro release) seja feito, exista um 1.0-SNAPSHOT. Essa versão é o que pode se tornar 1.0 . É basicamente " 1.0em desenvolvimento". Isso pode estar perto de um 1.0lançamento real ou muito distante (logo após o 0.9lançamento, por exemplo).

A diferença entre uma versão "real" e uma versão de instantâneo é que os instantâneos podem receber atualizações. Isso significa que o download de 1.0-SNAPSHOThoje pode gerar um arquivo diferente do que é feito ontem ou amanhã.

Normalmente, as dependências de snapshots devem existir apenas durante o desenvolvimento e nenhuma versão lançada (ou seja, nenhuma que não seja snapshot) deve ter dependência de uma versão de snapshot.

Joachim Sauer
fonte
67
@ anfphient: Não, o instantâneo não é necessariamente mais estável: é apenas a versão mais recente. O instantâneo precede o lançamento real, não vem depois dele. De fato, os números de versão normalmente não se referem a ramificações.
avandeursen
9
Os instantâneos do @avandeursen não têm necessariamente a semântica que você reivindica. Você pode ter "master-SNAPSHOT" e, posteriormente, fazer um lançamento 1.0. ele não precisa ser o "INSTANTÂNEO DO FutureVersion", nem necessariamente preceder um lançamento. Tudo o resto está certo - é uma referência instável a um alvo em movimento e não pode ser invocado para produzir uma construção repetível.
Scott Carey
3
Obrigado @ScottCarey. Provavelmente "precede" provavelmente seria mais preciso, pois não há garantia de que o "alvo móvel" acabará por existir.
Avandeursen
1
@ Jay: não, tanto quanto eu sei que não há como referenciar explicitamente um INSTANTÂNEO específico, eles não são endereçáveis ​​/ intercambiáveis ​​por design. Se você precisar de versões refinadas, basta liberar candidatos à versão com sequências de versão específicas (-RC1, -RC2 ou algo parecido).
Joachim Sauer
14
Por que eles não podem simplesmente chamá-lo de " 1.0-DEVELOPMENT" ou gostar de " 1.0-INPROGRESS", por que as pessoas têm que usar termos não óbvios
Uh_big_mike_boi
792

As outras três respostas fornecem uma boa visão do que é uma -SNAPSHOTversão. Eu só queria adicionar algumas informações sobre o comportamento do Maven quando ele encontrar uma SNAPSHOTdependência.

Quando você cria um aplicativo, o Maven pesquisa dependências no repositório local . Se uma versão estável não for encontrada lá, ela procurará nos repositórios remotos (definidos em settings.xmlou pom.xml) para recuperar essa dependência. Em seguida, ele será copiado para o repositório local, para disponibilizá-lo para as próximas construções.

Por exemplo, uma foo-1.0.jarbiblioteca é considerada uma versão estável e, se o Maven a encontrar no repositório local, ela será usada na versão atual.

Agora, se você precisar de uma foo-1.0-SNAPSHOT.jarbiblioteca, o Maven saberá que esta versão não é estável e está sujeita a alterações. É por isso que o Maven tentará encontrar uma versão mais recente nos repositórios remotos, mesmo que uma versão desta biblioteca seja encontrada no repositório local. No entanto, essa verificação é feita apenas uma vez por dia. Isso significa que se você tiver um foo-1.0-20110506.110000-1.jar(ou seja, esta biblioteca foi gerada em 06/05/2011 às 11:00:00) em seu repositório local, e se você executar a compilação do Maven novamente no mesmo dia, o Maven não verificará os repositórios para uma versão mais recente.

O Maven fornece uma maneira de alterar esta política de atualização na sua definição de repositório:

<repository>
    <id>foo-repository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

onde XXXpode estar:

  • sempre : o Maven procurará uma versão mais recente em todas as versões;
  • diariamente , o valor padrão;
  • intervalo: XXX : um intervalo em minutos (XXX)
  • nunca : o Maven nunca tentará recuperar outra versão. Isso será feito apenas se não existir localmente. Com a configuração, a SNAPSHOTversão será tratada como as bibliotecas estáveis.

(o modelo do settings.xml pode ser encontrado aqui)

Romain Linsolas
fonte
2
Parece que é possível usar a opção de linha de comando para força Maven baixar novamente todas as SNAPSHOTversões: mvn clean package -Ucomo por maven tutorial
Dimitry K
3
Cuidado com a -Ubandeira. Pode não fazer o que você espera devido ao MNG-4142 .
Kevin Cross
3
Também é importante mencionar que as boas práticas exigem que você não use dependências de instantâneos ao criar uma versão de lançamento e, de fato, o Maven Release Plugin falhará se houver dependências de instantâneos presentes.
RCross
2
Corri mvn installpara instalar um pote da versão 1.0-SNAPSHOT no meu repositório local. No dia seguinte, fiz alterações no projeto, mas não alterei a versão - então, ao executá- mvn installlo, não pareceu alterá-lo em meu repositório local. Esse comportamento é esperado? Não posso reutilizar uma versão e substituí-la mvn installdepois de fazer alterações?
Don Cheadle
1
@mmcrae AFAIK, ele deve ser atualizado. É isso que o objetivo da instalação faz, atualizando os frascos do INSTANTÂNEO local. Você descobriu outra coisa?
Johnny
73

O termo "INSTANTÂNEO" significa que a compilação é uma captura instantânea do seu código em um determinado momento.

Isso geralmente significa que esta versão ainda está em desenvolvimento pesado.

Quando o código estiver pronto e estiver na hora de liberá-lo, você desejará alterar a versão listada no POM. Então, em vez de ter um "INSTANTÂNEO", você usaria um rótulo como "1.0".

Para obter ajuda com o controle de versão, consulte a especificação de controle de versão semântico .

jjnguy
fonte
Em termos de versão semântica , uma versão -SNAPSHOT seria uma pré-versão: " Uma versão de pré-versão indica que a versão é instável e pode não atender aos requisitos de compatibilidade pretendidos, conforme indicado pela versão normal associada. Exemplos: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen
3
Parece-me que "INSTANTÂNEO" não é um "instantâneo do seu código em um horário específico", mas "a versão mais recente do código disponível". Se fosse HTTP, seria a bandeira que diz: "Não se preocupe em executar um HEAD, vá buscar o que estiver no servidor de qualquer maneira". Na verdade, é quase o "código oposto em um determinado momento".
Lilbyrdie 21/05
O que é desenvolvimento "pesado"?
Joker
1
@Joker "heavy" é quando muitas coisas estão mudando (novos recursos, refatoração etc.)
robert
28

Um "release" é a versão final para uma versão que não muda.

Um "instantâneo" é uma compilação que pode ser substituída por outra compilação com o mesmo nome. Isso implica que a construção pode mudar a qualquer momento e ainda está em desenvolvimento ativo.

Você tem artefatos diferentes para diferentes construções com base no mesmo código. Por exemplo, você pode ter um com depuração e outro sem. Um para Java 5.0 e outro para Java 6. Geralmente é mais simples ter uma compilação que faz tudo o que você precisa. ;)

Peter Lawrey
fonte
21

As versões do Maven podem conter uma string literal "SNAPSHOT" para indicar que um projeto está atualmente em desenvolvimento ativo.

Por exemplo, se seu projeto tiver uma versão de "1.0-SNAPSHOT" e você implantar os artefatos desse projeto em um repositório Maven, o Maven expandirá esta versão para "1.0-20080207-230803-1" se implantar uma liberação em 11 : 20:00 em 7 de fevereiro de 2008 UTC. Em outras palavras, quando você implanta um instantâneo, não está fazendo um release de um componente de software; você está liberando uma captura instantânea de um componente em um horário específico.

Portanto, principalmente as versões de instantâneo são usadas para projetos em desenvolvimento ativo. Se o seu projeto depender de um componente de software em desenvolvimento ativo, você poderá depender de uma versão instantânea, e o Maven tentará periodicamente fazer o download da última versão instantânea de um repositório ao executar uma compilação. Da mesma forma, se a próxima versão do seu sistema tiver uma versão “1.8”, seu projeto terá uma versão “1.8-SNAPSHOT” até que seja formalmente liberada.

Por exemplo, a dependência a seguir sempre baixava o JAR de desenvolvimento 1.8 mais recente da primavera:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

Um exemplo de processo de liberação maven

insira a descrição da imagem aqui

Joby Wilson Mathews
fonte
6

Eu gostaria de fazer uma observação sobre terminologia. As outras respostas deram boas explicações sobre o que é uma versão "instantânea" no contexto do Maven. Mas segue-se que uma versão não instantânea deve ser denominada versão "release"?

Existe alguma tensão entre a idéia de versão semântica de uma versão "release", que parece ser qualquer versão que não possua um qualificador como, -SNAPSHOTmas também não possua um qualificador como -beta.4; e a ideia de Maven de uma versão "release", que apenas parece incluir a ausência de -SNAPSHOT.

Em outras palavras, existe uma ambiguidade semântica sobre se "release" significa "podemos liberá-lo para o Maven Central" ou "o software está em seu release final para o público". Poderíamos considerar -beta.4uma versão de "lançamento" se o divulgarmos ao público, mas não é um "lançamento final". O versionamento semântico diz claramente que algo como -beta.4é uma versão de "pré-lançamento", portanto, não faria sentido ser chamado de versão de "release", mesmo sem ele -SNAPSHOT. De fato, por definição, mesmo -rc.5é um candidato a lançamento , não um lançamento real, mesmo que possamos permitir acesso público para teste.

Portanto, apesar de Maven, na minha opinião, parece mais apropriado chamar apenas uma versão de "release" que não tem qualificador algum, nem mesmo -beta.4. Talvez um nome melhor para uma versão não instantânea do Maven seja uma versão "estável" (inspirada em outra resposta ). Assim teríamos:

  • 1.2.3-beta.4-SNAPSHOT: Uma versão instantânea de uma versão de pré-lançamento.
  • 1.2.3-SNAPSHOT: Uma versão instantânea de uma versão de lançamento.
  • 1.2.3-beta.4: Uma versão estável de uma versão de pré-lançamento.
  • 1.2.3: Uma versão de lançamento (que é obviamente uma versão estável, sem instantâneos).
Garret Wilson
fonte
Você tem alguma informação sobre como o maven lida com metadados de compilação ou convenções de nomenclatura de pré-lançamento? Quero dizer, todos sabemos que o alfa precede o beta, mas o maven sabe? Mesmo que considere o 1.2.3-beta.4 como uma versão estável, ele sabe pelo menos que o 1.2.3 está APÓS?
DGoiko
5

É assim que um instantâneo se parece com um repositório e, nesse caso, não está ativado, o que significa que o repositório mencionado aqui é estável e não há necessidade de atualizações.

<project>
    ...
    <repositories>
        <repository>
            <id>lds-main</id>
            <name>LDS Main Repo</name>
            <url>http://code.lds.org/nexus/content/groups/main-repo</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

Outro caso seria para:

<snapshots>
        <enabled>true</enabled>
</snapshots>

o que significa que o Maven procurará atualizações para este repositório. Você também pode especificar um intervalo para as atualizações com a tag.

Kati Holasz
fonte
5

geralmente no maven, temos dois tipos de builds 1) snapshot builds 2) release builds

  1. builds de snapshots: SNAPSHOT é a versão especial que indica a cópia atual da implantação, não como uma versão regular. O maven verifica a versão de todas as builds no repositório remoto, para que as builds de snapshot não sejam nada além de builds de desenvolvimento.

  2. Liberações de versão: Release significa remover o SNAPSHOT na versão da versão, essas são as versões regulares da versão.

Venky Vungarala
fonte
3

simplesmente instantâneo significa que é a versão que não é estável.

quando a versão inclui um instantâneo como 1.0.0 -SNAPSHOT significa que não é uma versão estável e procura repositório remoto para resolver dependências

shanika prasangika
fonte
1

entender o contexto do SDLC ajudará a entender a diferença entre o instantâneo e o release. Durante o processo de desenvolvimento, todos os desenvolvedores contribuem com seus recursos para uma ramificação da linha de base. Em algum momento, o lead acha que recursos suficientes foram acumulados e, em seguida, ele cortará um ramo de liberação do ramo da linha de base. Quaisquer construções anteriores a esse ponto no tempo são capturas instantâneas. As compilações postadas até este ponto são lançadas. Observe que as compilações de versão também podem mudar antes de ir para a produção, se houver algum defeito durante o teste de versão.

CCNA
fonte
1

Instantâneo significa simplesmente que, dependendo da sua configuração, o Maven verificará as alterações mais recentes em uma dependência especial. O instantâneo é instável porque está em desenvolvimento, mas se em um projeto especial precisar das alterações mais recentes, você deve configurar sua versão de dependência para a versão de instantâneo. Esse cenário ocorre em grandes organizações com vários produtos com os quais esses produtos se relacionam muito de perto.

Mahdi Soltani
fonte
0

Como o nome sugere, o instantâneo se refere a um estado do projeto e suas dependências naquele momento. Sempre que o maven encontra um INSTANTÂNEO mais novo do projeto, faz o download e substitui o arquivo .jar mais antigo do projeto no repositório local.

As versões de instantâneo são usadas para projetos em desenvolvimento ativo. Se o seu projeto depender de um componente de software em desenvolvimento ativo, você poderá depender de uma versão instantânea, e o Maven tentará periodicamente fazer o download da última versão instantânea de um repositório ao executar uma compilação.

Sourabh Bhavsar
fonte