Posso definir a versão do projeto com um maven-buildnumber-plugin?
-
22-07-2019 - |
Pergunta
Eu estou tentando adicionar o svn.revision a versão do projeto como um número de compilação e não consigo fazê-lo. Meu frasco tem o nome correto durin embalagem, mas o seu instalado no meu repositório local é como se $ {BuildNumber} é / foi indefinido quando a versão foi definida.
Eu recebo foo-1.0.0-SNAPSHOT- $ {BuildNumber} em vez de foo-1.0.0-SNAPSHOT- 304
Qualquer idéia do que estou fazendo de errado ou está adicionando uma revisão para a versão do projeto uma má idéia? Obrigado pela ajuda.
<project>
...
<version>1.0.0-${release.identifier}-${buildNumber}</version>
<properties>
<release.identifier>SNAPSHOT</release.identifier>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<executions>
<execution>
<id>useLastCommittedRevision</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</project>
Solução
O problema tem duas partes:
-
Você está tentando definir o
buildNumber
para a versão antes de ser resolvido por isso será sempre${buildNumber}
em vez do valor resolvido.Em vez de tentar alterar dinamicamente a versão, você deve definir o
buildNumber
no elementofinalName
na compilação. Isto irá criar os artefatos com o nome pretendido no repositório local. -
A instalação do plugin irá ignorar o
finalName
e implantá-lo como1.0.0-SNAPSHOT
independentemente, eu não sei de uma maneira de endereço que. ObuildNumber
é adicionado ao manifesto, se você configurar o plugin como abaixo.Assim sua configuração seria algo como:
<version>1.0.0-${release.identifier}</version> ... <build> <finalName>${project.artifactId}-${project.version}-${buildNumber}</finalName> ... </build>
Gostaria de evitar o uso de números de compilação em projetos SNAPSHOT
.
Maven fornece a SNAPSHOT
palavra-chave para significar um projeto volátil em desenvolvimento ativo. Então, se você faz referência a um projeto com uma versão SNAPSHOT
dependência, Maven irá verificar automaticamente se há atualizações e mantenha suas dependências em sincronia.
Se você, em seguida, adicionar um número de compilação para o final dessa versão, você terá que atualizar manualmente as dependências, assim você perder qualquer benefício de ter o sufixo SNAPSHOT
.
Eu, pessoalmente, evitar o uso de números de compilação sempre que possível de qualquer maneira. Se eu tiver que atualizar um projeto, eu apenas bater o número da versão, ou usar um sufixo como beta-2
ou RC2
. Se você precisa controlar a revisão na SNAPSHOT
, eu recomendo adicionando-o ao Manifesto para que possa verificar onde a construção originou, mas usar o sufixo SNAPSHOT
padrão para permitir Maven para resolver as versões normalmente. A configuração abaixo mostra como adicionar a revisão para o manifesto.
No que diz respeito a sua configuração está em causa, parece OK para mim assumindo que o seu url SCM está configurado corretamente. Se você não tem nenhuma configuração de SCM em sua POM que pode ser o problema.
Você pode correr com -X
e verificar se há qualquer saída do plug-in indicando por isso que não está definindo a propriedade?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>0.9.4</version>
<executions>
<execution>
<id>useLastCommittedRevision</id>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Build>${buildNumber}</Implementation-Build>
</manifestEntries>
</archive>
</configuration>
</plugin>
Outras dicas
Adicione esta após a buildnumber-maven-plugin
:
<plugin>
<groupId>io.github.michaldo</groupId>
<artifactId>nashorn-maven-plugin</artifactId>
<version>0.0.1</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>eval</goal>
</goals>
<configuration>
<script>
$project.artifact.version = "${buildNumber}";
</script>
</configuration>
</execution>
</executions>
</plugin>
E o buildNumber
será reconhecido pela embalagem e implantar.