227 votes

Comment obtenir la version du projet Maven sur la ligne de commande bash

Précédente, j'ai lancé une question sur comment changer de projet Maven vesion de ligne de commande qui me conduisent à une nouvelle question.

Auparavant, j'ai été en mesure d'obtenir le numéro de version depuis la version a été stocké dans une propriété qui a été facile de grep et de l'analyser à partir de la ligne de commande (bash). Maintenant que l'pom.xml l'élément est utilisé pour cela, il n'est plus unique, car toutes les dépendances et peut-être quelques autres, trop de les utiliser. Je pense qu'il n'y a aucun moyen d'obtenir le numéro de la version actuelle avec un script bash sans outils externes pour le traitement xml ou certains très sensible au contexte sed commande.

Le plus propre solution, à mon opinnion serait Maven main de cette version information. Je pensais écrire un personnalisé plugin maven pour la récupération des propriétés différentes, mais j'ai pensé que je voudrais vous demander d'abord ici.

Donc, est-il un moyen facile pour obtenir la valeur de ${project.version} de la ligne de commande? Merci à l'avance.

Solution

Je vous remercie pour l'aide. Je devais cd pour le répertoire à la main, mais qui peut être fait facilement. Dans mon script bash que j'ai

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 } }'`

Ce qui me donne la version actuelle que je peux ensuite l'avance. Grepping peut-être plus simple mais j'ai pensé que je voudrais aussi robuste que possible, donc je suis satisfait de la première ligne qui commence par un numéro et essayer de gérer cela comme un numéro de version.

# 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/"
}

Et je l'utiliser en appelant simplement

new_version=$(advance_version $version)

Espérons que cela aide quelqu'un.

250voto

Pascal Thivent Points 295221

Le plugin d'aide Maven propose déjà quelque chose pour cela:

  • help:evaluate évalue les expressions Maven données par l'utilisateur en mode interactif.

Voici comment l'invoquer sur la ligne de commande pour obtenir le ${project.version} :

 mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
    -Dexpression=project.version
 

49voto

user1712021 Points 111
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['

7voto

Tom Points 41

Si vous n'avez pas l'esprit d'écrire la version dans un fichier temporaire, il y a une autre solution (sans grep/sed) qui fonctionne bien pour moi.

J'utilise le Exec Plugin Maven avec l' echo binaire. En revanche pour le Maven Aide du Plugin, le Plugin Exec permet la redirection de sortie dans un fichier, qui peut être utilisé pour contourner grep/sed, et il est même possible d'analyser les choses étranges comme multiligne version des chaînes de caractères (avec bloc CDATA dans la version tag), au moins dans une certaine mesure.

#!/usr/bin/env sh

MVN_VERSION=""
VERSION_FILE=$( mktemp mvn_project_version_XXXXX )
trap "rm -f -- \"$VERSION_FILE\"" INT EXIT

mvn -Dexec.executable="echo" \
    -Dexec.args='${project.version}' \
    -Dexec.outputFile="$VERSION_FILE" \
    --non-recursive \
    --batch-mode \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec > /dev/null 2>&1 ||
    { echo "Maven invocation failed!" 1>&2; exit 1; }

# if you just care about the first line of the version, which will be
# sufficent for pretty much every use case I can imagine, you can use
# the read builtin
[ -s "$VERSION_FILE" ] && read -r MVN_VERSION < "$VERSION_FILE"

# Otherwise, you could use cat.
# Note that this still has issues when there are leading whitespaces
# in the multiline version string
#MVN_VERSION=$( cat "$VERSION_FILE" )

printf "Maven project version: %s\n" "$MVN_VERSION"

5voto

quickshiftin Points 6379

J'ai remarqué que certains parasites Downloaded: lignes à venir dans la sortie qui ont été de briser mon affectation d'origine. Voici le filtre, j'ai installé sur; espérons que cela aide!

version=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v '^\[|Downloading:' | tr -d ' \n')

MODIFIER

Pas sûr à 100% pourquoi, mais lors de l'exécution du présent par le biais d'un post-script de construction dans Jenkins, la sortie a été sortant de l' [INFO]version, par exemple, [INFO]0.3.2.

J'ai viré la sortie vers un fichier, et il a couru à travers mon premier filtre directement à partir de BASH, il fonctionne très bien.., donc encore une fois, vous ne savez pas ce qui se passe dans Jenkins terre.

Pour obtenir 100% dans Jenkins, j'ai ajouté un suivi sed filtre; voici mon dernier

version=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v '^\[|Downloading:' | tr -d ' \n' | sed -E 's/\[.*\]//g')

MODIFIER

Une dernière remarque ici.. j'ai trouvé tr a toujours résultant dans des choses comme l' /r/n0.3.2 (encore une fois uniquement lors de l'exécution via Jenkins). Basculé awk , et le problème a disparu! Mon dernier travail résultat

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version \
| egrep -v '^\[|Downloading:' | sed 's/[^0-9\.]//g' | awk 1 ORS=''

4voto

Peter Dietz Points 156

Le facile à comprendre, tout-en-une solution pour la sortie du projet maven version, et supprime la sortie superflues d' [INFO] et Download messages:

mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['

Même chose, mais s'est divisé sur deux lignes:

mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
      -Dexpression=project.version | grep -v '\['

Sorties: 4.3-SNAPSHOT

Donc, à l'aide de votre project.version en un simple script bash:

projectVersion=`mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['`
cd "target/"$projectVersion"-build"

D'autres solutions sur cette page ne semble pas combiner tous les trucs en un seul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X