Respostas:
Uma versão de instantâneo no Maven é aquela que não foi lançada.
A idéia é que, antes que um 1.0
release (ou qualquer outro release) seja feito, exista um 1.0-SNAPSHOT
. Essa versão é o que pode se tornar 1.0
. É basicamente " 1.0
em desenvolvimento". Isso pode estar perto de um 1.0
lançamento real ou muito distante (logo após o 0.9
lanç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-SNAPSHOT
hoje 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.
1.0-DEVELOPMENT
" ou gostar de " 1.0-INPROGRESS
", por que as pessoas têm que usar termos não óbvios
As outras três respostas fornecem uma boa visão do que é uma -SNAPSHOT
versão. Eu só queria adicionar algumas informações sobre o comportamento do Maven quando ele encontrar uma SNAPSHOT
dependê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.xml
ou 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.jar
biblioteca é 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.jar
biblioteca, 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 XXX
pode estar:
SNAPSHOT
versão será tratada como as bibliotecas estáveis.(o modelo do settings.xml pode ser encontrado aqui)
SNAPSHOT
versões: mvn clean package -U
como por maven tutorial
-U
bandeira. Pode não fazer o que você espera devido ao MNG-4142 .
mvn install
para 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 install
lo, não pareceu alterá-lo em meu repositório local. Esse comportamento é esperado? Não posso reutilizar uma versão e substituí-la mvn install
depois de fazer alterações?
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 .
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. ;)
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>
Um exemplo de processo de liberação maven
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, -SNAPSHOT
mas 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.4
uma 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).É 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.
geralmente no maven, temos dois tipos de builds 1) snapshot builds 2) release builds
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.
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.
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
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.
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.
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.