Anterior Emiti uma pergunta sobre como alterar a versão do projeto Maven da linha de comando que me levou a um novo problema.
Anteriormente, eu era capaz de obter o número da versão, pois a versão era armazenada como uma propriedade que era fácil de grep e analisar na linha de comando (bash). Agora que o elemento pom.xml é usado para isso, ele não é mais exclusivo, pois todas as dependências e talvez alguns outros também o usam. Eu acho que não há como obter o número da versão atual com um script bash sem ferramentas externas para analisar xml ou algum comando sed muito sensível ao contexto.
A solução mais limpa na minha opinião seria que o Maven distribuísse as informações dessa versão. Eu estava pensando em escrever um plug-in personalizado para recuperar propriedades diferentes, mas pensei em perguntar aqui primeiro.
Então, existe alguma maneira fácil de obter o valor da ${project.version}
linha de comando? Desde já, obrigado.
Solução
Obrigado pela ajuda. Eu tive que ir cd
para o diretório manualmente, mas isso pode ser feito facilmente. No meu script bash eu tenho
version=`cd $project_loc && mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }'`
O que me dá a versão atual que eu posso avançar. O Grepping pode ser mais simples, mas achei que fosse o mais robusto possível, por isso estou satisfeito com a primeira linha que começa com um número e tento lidar com isso como um número de versão.
# Advances the last number of the given version string by one.
function advance_version () {
local v=$1
# Get the last number. First remove any suffixes (such as '-SNAPSHOT').
local cleaned=`echo $v | sed -e 's/[^0-9][^0-9]*$//'`
local last_num=`echo $cleaned | sed -e 's/[0-9]*\.//g'`
local next_num=$(($last_num+1))
# Finally replace the last number in version string with the new one.
echo $v | sed -e "s/[0-9][0-9]*\([^0-9]*\)$/$next_num/"
}
E eu uso isso simplesmente chamando
new_version=$(advance_version $version)
Espero que isso ajude alguém.
fonte
grep -e '^[[:digit:]]'
Respostas:
O Maven Help Plugin já está de alguma forma propondo algo para isso:
Aqui está como você o chamaria na linha de comando para obter
${project.version}
:fonte
[INFO]
mensagens? Não encontrei um interruptor para o maven. Caso contrário, adicionarei alguns scripts de linha de comando para analisar o número da versão.mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
. Para capturá-lo em uma variável em uso Bashversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
A solução de Tom com o Exec Maven Plugin é muito melhor, mas ainda mais complicada do que precisa. Para mim, é tão simples quanto:
fonte
mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
-Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'
.[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (default-cli) on project audit-events-processor-parent: Command execution failed. Cannot run program "maven" (in directory "/tmp"): error=2, No such file or directory
encolher ainda outra resposta que não funciona para mim, oh bemset -o errexit
Tenho pesquisado e descobri o seguinte:
O Maven foi responsabilizado porque a integração com as ferramentas do DevOps não é fácil devido ao fato de não seguir algumas boas práticas em relação às ferramentas da CLI. (ref: https://youtu.be/1ILEw6Qca3U?t=372 )
Inspirado na afirmação anterior, decidi dar uma olhada no código fonte do maven, bem como no maven-help-plugin. Parece que eles corrigiram um pouco a opção -q do maven (eu estou usando a versão 3.5.3), então agora, se você a aprovar, não obterá todo o material irritante de log sem sentido que impede a utilização do maven dentro de scripts automatizados. Portanto, você deve poder usar algo como isto:
O problema é que esse comando não imprime nada porque, por padrão, o plug-in de ajuda é enviado pelo criador de logs que foi silenciado pela opção -q. (a versão mais recente disponível do plugin é 3.1.0 lançada em 3 de junho de 2018)
Karl Heinz Marbaise ( https://github.com/khmarbaise ) o corrigiu adicionando um parâmetro opcional que permite chamá-lo da seguinte maneira:
A descrição da confirmação está disponível em: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )
fonte
-q
opção, ela imprime a versão corretamente (entre as linhas de log). Alguma ideia?-q
switch.-q -DforceStdout
estava vazia, garantindo que a versão 3.1.0 do plugin fosse usada com pluginManagement); i configurado invólucro maven com a versão 3.5.4 do perito, e ele funcionou corretamentefonte
2> /dev/null
como você pode obter #Picked up _JAVA_OPTIONS:
| findstr /v "["
.A resposta principal é bastante lixo, na minha opinião, você precisa usar um monte de grep para hackear a saída do console maven. Por que não usar a ferramenta certa para o trabalho? O uso da sintaxe xpath é a melhor abordagem para recuperar o número da versão, pois é o método pretendido para acessar uma estrutura de dados XML. A expressão abaixo está percorrendo o pom usando o "nome local" dos elementos, ou seja, ignorando as declarações de namespace que podem ou não estar presentes no xml.
fonte
mvn
é a abordagem correta e oexec
plug - in realmente funciona bem, mas todas as soluções mvn precisam ser resolvidas e estou tentando inicializar um pipeline de construção em que a resolução de dependência não funcione, por isso vou substituir aexec
abordagem por esta solução. Felizmente, não preciso me preocupar com versões herdadas dos pais.${revision}
por exemplo. Ref. maven.apache.org/maven-ci-friendly.htmlIsso evitará a necessidade de receber as entradas de log da saída:
fonte
Esta é a solução mais limpa que encontrei:
Vantagens:
pom.xml
Nota:
maven-help-plugin
versão3.2.0
(e acima) temforceStdout
opção. Você pode substituir o3.2.0
comando acima por uma versão mais recente da lista de versões disponíveis do mvn-help-plugin do artifactory, se disponível.-q
suprime mensagens detalhadas ([INFO]
,[WARN]
etc.)Se você deseja buscar
groupId
eartifactId
também, marque esta resposta .fonte
Contanto que você tenha python 2.5 ou superior, isso deve funcionar. Se você tiver uma versão inferior a essa, instale
python-lxml
e altere a importação para lxml.etree. Este método é rápido e não requer o download de plug-ins extras. Também funciona em arquivos pom.xml malformados que não são validados com xmllint, como os que eu preciso analisar. Testado em Mac e Linux.fonte
Eu continuei correndo para casos secundários ao usar algumas das outras respostas aqui, então aqui está mais uma alternativa.
fonte
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
Se você não se importa em escrever a versão em um arquivo temporário, existe outra solução (sem grep / sed) que funciona bem para mim. ( EDIT : veja a resposta de rjrjr para uma solução muito mais simples, sem qualquer aborrecimento de arquivo temporário)
Eu uso o Exec Maven Plugin junto com o
echo
binário. Ao contrário do Maven Help Plugin, o Exec Plugin permite o redirecionamento de saída para um arquivo, que pode ser usado para ignorar o grep / sed, e torna ainda possível analisar coisas estranhas, como seqüências de caracteres de versão com várias linhas (com bloco CDATA na tag de versão), pelo menos até certo ponto.fonte
Apenas para o registro, é possível configurar o log SLF4J simples do Maven diretamente na linha de comando para gerar apenas o que precisamos, configurando:
org.slf4j.simpleLogger.defaultLogLevel=WARN
eorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO
conforme documentado em http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Como resultado, pode-se executar simplesmente
tail -1
e obter:Observe que este é um item único.
MAVEN_OPTS
estão sendo reescritos apenas para estamvn
execução específica .fonte
Notei algumas
Downloaded:
linhas espúrias na saída que estavam quebrando minha tarefa original. Aqui está o filtro em que eu decidi; espero que ajude!EDITAR
Não tenho 100% de certeza do motivo, mas ao executar isso por meio de um script pós-compilação no Jenkins, a saída estava saindo como
[INFO]version
, por exemplo,[INFO]0.3.2
.Coloquei a saída em um arquivo e executei-a no meu primeiro filtro diretamente do BASH, funciona bem ... então, novamente, sem saber o que está acontecendo na terra de Jenkins.
Para obtê-lo 100% no Jenkins, adicionei um
sed
filtro de acompanhamento ; aqui está o meu mais recenteEDITAR
Uma última nota aqui .. Eu descobri que ainda
tr
estava resultando em coisas como (novamente apenas quando executado via Jenkins). Mudou para e o problema desapareceu! Meu resultado final de trabalho/r/n0.3.2
awk
fonte
Uma solução simples e única
E para pontos de bônus analisados parte de uma versão
fonte
Desenvolvi recentemente o plug-in Release Candidate Maven que resolve esse problema exato, para que você não precise recorrer a nenhum script de shell hacky e analisar a saída do
maven-help-plugin
.Por exemplo, para imprimir a versão do seu projeto Maven em um terminal, execute:
que fornece uma saída semelhante a
maven-help-plugin
:No entanto, você também pode especificar um formato de saída arbitrário (para que a versão possa ser selecionada no log por um servidor de IC, como o TeamCity ):
O que resulta em:
Para salvar a saída em um arquivo (para que um servidor de IC como o Jenkins possa usá-lo ):
O
version.properties
arquivo resultante terá a seguinte aparência:Além disso, o Release Candidate também permite definir a versão do seu projeto (algo que você provavelmente faria no servidor de CI) com base na versão da API que você definiu no seu POM.
Se você quiser ver um exemplo de Release Candidate sendo usado como parte do ciclo de vida do Maven, dê uma olhada no
pom.xml
meu outro projeto de código aberto - Build Monitor for Jenkins .fonte
Há também uma opção sem a necessidade do Maven:
fonte
grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p
Para obter a terceira ocorrência, use:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p
e assim por dianteA solução tudo-em-um fácil de entender que gera a versão do projeto maven e suprime a saída estranha de
[INFO]
eDownload
mensagens:A mesma coisa, mas dividida em duas linhas:
Saídas:
4.3-SNAPSHOT
Então, usando o seu
project.version
em um script simples do bash:Outras soluções nesta página não pareciam combinar todos os truques em um.
fonte
Deveria ser mais fácil, pois esse bug foi corrigido no maven-help-plugin 3.0.0: MPH-99 Evaluate não possui saída no modo silencioso .
fonte
Essa é de longe a solução mais fácil de cortar e colar no bash:
ecoa
fonte
Encontrei o equilíbrio certo para mim. Após o
mvn package
maven-archiver, o plugin criatarget/maven-archiver/pom.properties
com conteúdo como estee eu estou usando o bash apenas para executá-lo
então
É claro que isso não é seguro para executar este arquivo, mas a execução pode ser facilmente convertida em script perl ou bash para ler e definir variáveis de ambiente a partir desse arquivo.
fonte
Isso funcionou para mim, offline e sem depender do mvn:
fonte
O plug-in Exec funciona sem nenhuma análise de saída, porque a saída pode ser redirecionada para o arquivo e injetada novamente no ambiente de trabalho através do plug-in EnvInject:
fonte
Com base na pergunta, eu uso este script abaixo para aumentar automaticamente meu número de versão em todos os pais / submódulos maven:
fonte
Você
mvn
deu a resposta (como a maioria das respostas sugere) ou extrai a resposta dapom.xml
. A única desvantagem da segunda abordagem é que você pode extrair facilmente o valor da<version/>
tag, mas isso só será significativo se for literal , ou seja, não for uma propriedade Maven. Eu escolhi essa abordagem de qualquer maneira porque:mvn
é uma maneira detalhada e eu simplesmente não gosto de filtrar sua saída.mvn
é muito lento em comparação com a leitura dopom.xml
.<version/>
.mvn-version
é umzsh
script de shell usadoxmlstarlet
para lerpom.xml
e imprimir a versão do projeto (se existir) ou a versão do projeto pai (se existir):A vantagem é que é muito mais rápido que a execução
mvn
:A diferença na minha máquina é maior que duas ordens de magnitude.
fonte
Preciso exatamente desse requisito durante meu trabalho no Travis, mas com vários valores. Começo com esta solução, mas ao chamar várias vezes isso é muito lento (preciso de 5 expressões).
Eu escrevi um plugin simples do maven para extrair os valores do pom.xml no arquivo .sh.
https://github.com/famaridon/ci-tools-maven-plugin
Produzirá isso:
agora você pode simplesmente obter o arquivo
Diverta-se.
fonte
Estou usando um one-liner no meu shell unix ...
Você pode ocultar essa linha em um script de shell ou como um alias.
fonte
esta é uma edição de cima
Eu testei no cmdline funciona bem
grep "" pom.xml | cabeça -n 1 | sed -e "s / versão // g" | sed -e "s / \ s * [<> /] * // g"
é outra versão do mesmo. Preciso obter o número da versão no Jenkins CI no k8s sem o mvn instalado, portanto, isso é muito útil
obrigado a todos.
fonte
Estou apenas adicionando um pequeno
sed
aprimoramento de filtro que recentemente implementei para extrairproject.version
da saída maven.fonte
Isto é o que eu costumava obter o número da versão, pensei que haveria uma maneira melhor de fazê-lo
fonte