Auparavant, j'ai publié une question sur la façon de changer la version du projet Maven de la ligne de commande, ce qui m'a amené à un nouveau problème.
Auparavant, je pouvais obtenir le numéro de version car la version était stockée en tant que propriété facile à grep et à analyser à partir de la ligne de commande (bash). Maintenant que l'élément pom.xml est utilisé pour cela, il n'est plus unique car toutes les dépendances et peut-être d'autres aussi l'utilisent. Je pense qu'il n'y a aucun moyen d'obtenir le numéro de version actuel avec un script bash sans outils externes pour analyser xml ou une commande sed très sensible au contexte.
La solution la plus propre à mon avis serait que Maven distribue ces informations de version. Je pensais à écrire un plugin maven personnalisé pour récupérer différentes propriétés mais j'ai pensé que je demanderais d'abord ici.
Alors, existe-t-il un moyen simple d'obtenir la valeur de ${project.version}
sur la ligne de commande? Merci d'avance.
Solution
Merci pour l'aide. J'ai dû cd
manuellement le répertoire mais cela peut être fait facilement. Dans mon script bash, 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 avancer. Grepping pourrait être plus simple mais je pensais que je voudrais aussi robuste que possible, donc je suis satisfait de la première ligne qui commence par un nombre et essayez 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'utilise en appelant simplement
new_version=$(advance_version $version)
J'espère que cela aide quelqu'un.
la source
grep -e '^[[:digit:]]'
Réponses:
Le plugin d'aide Maven propose déjà quelque chose pour cela:
Voici comment vous pouvez l'invoquer sur la ligne de commande pour obtenir
${project.version}
:la source
[INFO]
messages? Je n'ai pas trouvé d'interrupteur pour Maven. Sinon, je vais simplement ajouter des scripts de ligne de commande pour analyser le numéro de version.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
. Pour le capturer dans une variable dans Bash, utilisezversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
La solution de Tom avec le plugin Exec Maven est bien meilleure, mais toujours plus compliquée qu'elle ne devrait l'être. Pour moi, c'est aussi simple que:
la source
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
hausser les épaules encore une autre réponse qui ne fonctionne pas pour moi, eh bienset -o errexit
J'ai fait quelques recherches et j'ai trouvé ce qui suit:
Maven a été blâmé parce que l'intégration avec les outils DevOps n'est pas facile car il ne respecte pas certaines bonnes pratiques concernant les outils CLI. (réf: https://youtu.be/1ILEw6Qca3U?t=372 )
Inspiré de l'assertion précédente, j'ai décidé de jeter un œil au code source de maven ainsi qu'au maven-help-plugin. Il semble qu'ils aient corrigé un peu le commutateur -q du maven (j'utilise la version 3.5.3), donc maintenant si vous le réussissez, vous n'obtiendrez pas tous les trucs de journalisation ennuyeux qui empêchent l'utilisation de maven dans des scripts automatisés. Vous devriez donc pouvoir utiliser quelque chose comme ceci:
Le problème est que cette commande n'imprime rien car par défaut le plugin d'aide sort par le logger qui a été désactivé par le commutateur -q. (la dernière version disponible du plugin est 3.1.0 publiée le 3 juin 2018)
Karl Heinz Marbaise ( https://github.com/khmarbaise ) l'a corrigé en ajoutant un paramètre facultatif qui vous permet de l'appeler de la manière suivante:
La description de la validation est disponible sur: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )
la source
-q
commutateur, il imprime correctement la version (entre les lignes de journal). Des idées?-q
commutateur.-q -DforceStdout
était vide, même en s'assurant que la version 3.1.0 du plugin était utilisée avec pluginManagement); j'ai configuré le wrapper maven avec la version 3.5.4 de maven, et cela a fonctionné correctementla source
2> /dev/null
, sinon vous pouvez obtenirPicked up _JAVA_OPTIONS:
| findstr /v "["
.À mon avis, la meilleure réponse est assez poubelle, vous devez utiliser un tas de grep pour pirater la sortie de la console Maven. Pourquoi ne pas utiliser le bon outil pour le travail? L'utilisation de la syntaxe xpath est la meilleure approche pour récupérer le numéro de version, car c'est la méthode prévue pour accéder à une structure de données XML. L'expression ci-dessous traverse le pom en utilisant le "nom local" des éléments, en d'autres termes en ignorant les déclarations d'espace de noms qui peuvent ou non être présentes dans le xml.
la source
mvn
est la bonne approche et leexec
plugin fonctionne bien, mais toutes les solutions mvn doivent être résolues et j'essaie d'amorcer un pipeline de construction où la résolution des dépendances ne fonctionnera pas, donc je vais remplacer l'exec
approche par cette solution. Heureusement, je n'ai pas à me soucier des versions héritées des parents.${revision}
par exemple. Réf. maven.apache.org/maven-ci-friendly.htmlCela évitera d'avoir à récupérer les entrées de journal de la sortie:
la source
Voici la solution la plus propre que j'ai trouvée:
Avantages:
pom.xml
Remarque:
maven-help-plugin
la version3.2.0
(et supérieure) a uneforceStdout
option. Vous pouvez remplacer la3.2.0
commande ci-dessus par une version plus récente de la liste des versions disponibles de mvn-help-plugin de artifactory, si disponible.-q
supprime les messages verbeux ([INFO]
,[WARN]
etc.)Si vous voulez chercher
groupId
etartifactId
ainsi, vérifier cette réponse .la source
Tant que vous avez python 2.5 ou supérieur, cela devrait fonctionner. Si vous disposez d'une version inférieure à celle-ci, installez
python-lxml
et modifiez l'importation en lxml.etree. Cette méthode est rapide et ne nécessite aucun téléchargement de plugins supplémentaires. Il fonctionne également sur les fichiers pom.xml malformés qui ne sont pas validés avec xmllint, comme ceux que j'ai besoin d'analyser. Testé sur Mac et Linux.la source
J'ai continué à rencontrer des cas secondaires lorsque j'utilisais certaines des autres réponses ici, alors voici encore une autre alternative.
la source
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
Si cela ne vous dérange pas d'écrire la version dans un fichier temporaire, il existe une autre solution (sans grep / sed) qui fonctionne bien pour moi. ( EDIT : voir la réponse de rjrjr pour une solution beaucoup plus simple sans aucun problème de fichier temporaire)
J'utilise le plugin Exec Maven avec le
echo
binaire. Contrairement au plug-in d'aide Maven, le plug-in Exec permet la redirection de sortie vers un fichier, qui peut être utilisé pour contourner grep / sed, et permet même d'analyser des choses étranges comme les chaînes de version multiligne (avec le bloc CDATA dans la balise de version), au moins dans une certaine mesure.la source
Pour mémoire, il est possible de configurer la journalisation Simple SLF4J de Maven directement dans la ligne de commande pour afficher uniquement ce dont nous avons besoin en configurant:
org.slf4j.simpleLogger.defaultLogLevel=WARN
etorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO
tel que documenté à http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html
En conséquence, on peut exécuter simplement
tail -1
et obtenir:Notez qu'il s'agit d'une doublure.
MAVEN_OPTS
sont en cours de réécriture uniquement pour cettemvn
exécution particulière .la source
J'ai remarqué des
Downloaded:
lignes parasites entrant dans la sortie qui rompaient mon affectation d'origine. Voici le filtre sur lequel je me suis installé; J'espère que ça aide!ÉDITER
Je ne sais pas à 100% pourquoi, mais lors de l'exécution de cela via un script post-build dans Jenkins, la sortie sortait par
[INFO]version
exemple[INFO]0.3.2
.J'ai vidé la sortie dans un fichier et l'ai exécuté via mon premier filtre directement à partir de BASH, cela fonctionne bien .., encore une fois, je ne sais pas ce qui se passe dans le pays Jenkins.
Pour l'obtenir à 100% dans Jenkins, j'ai ajouté un
sed
filtre de suivi ; voici mon dernierÉDITER
Une dernière remarque ici .. J'ai découvert
tr
était encore entraînant des choses comme/r/n0.3.2
(encore une fois que lors de l' exécution par Jenkins). Passé àawk
et le problème a disparu! Mon résultat de travail finalla source
Une solution simple Maven
Et pour les points bonus, une partie analysée d'une version
la source
J'ai récemment développé le plugin Release Candidate Maven qui résout ce problème exact afin que vous n'ayez pas à recourir à des scripts shell hacky et à analyser la sortie du
maven-help-plugin
.Par exemple, pour imprimer la version de votre projet Maven sur un terminal, exécutez:
ce qui donne une sortie similaire à
maven-help-plugin
:Cependant, vous pouvez également spécifier un format de sortie arbitraire (afin que la version puisse être récupérée dans le journal par un serveur CI tel que TeamCity ):
Ce qui se traduit par:
Pour enregistrer la sortie dans un fichier (afin qu'un serveur CI tel que Jenkins puisse l' utiliser ):
Le
version.properties
fichier résultant se présente comme suit:En plus de tout ce qui précède, Release Candidate vous permet également de définir la version de votre projet (ce que vous feriez probablement sur votre serveur CI) en fonction de la version d'API que vous avez définie dans votre POM.
Si vous souhaitez voir un exemple d'utilisation de Release Candidate dans le cadre du cycle de vie Maven, jetez un œil à
pom.xml
mon autre projet open-source - Build Monitor for Jenkins .la source
Il y a aussi une option sans avoir besoin de Maven:
la source
grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p
Pour obtenir la troisième occurrence, utilisez:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p
etc.La solution tout-en-un facile à comprendre qui génère la version du projet maven et supprime la sortie
[INFO]
et lesDownload
messages étrangers :Même chose, mais divisé en deux lignes:
Les sorties:
4.3-SNAPSHOT
Donc, en utilisant votre
project.version
dans un simple script bash:Les autres solutions de cette page ne semblent pas combiner toutes les astuces en une seule.
la source
Cela devrait être plus facile car ce bogue est corrigé dans maven-help-plugin 3.0.0: MPH-99 Evaluate n'a pas de sortie en mode silencieux .
la source
C'est de loin la solution de couper-coller la plus simple:
ça fait écho
la source
J'ai trouvé le bon équilibre pour moi. Après que le
mvn package
plugin maven-archiver créetarget/maven-archiver/pom.properties
avec des contenus comme celui-ciet j'utilise bash juste pour l'exécuter
puis
Bien sûr, il n'est pas du tout sûr d'exécuter ce fichier, mais l'exécution peut facilement être convertie en script perl ou bash pour lire et définir la variable d'environnement à partir de ce fichier.
la source
Cela a fonctionné pour moi, hors ligne et sans dépendre de mvn:
la source
Le plugin Exec fonctionne sans analyse de sortie car la sortie peut être redirigée dans un fichier et réinjectée dans l'environnement de travail via le plugin EnvInject:
la source
Sur la base de la question, j'utilise ce script ci-dessous pour augmenter automatiquement mon numéro de version dans tous les parents / sous-modules maven:
la source
Soit vous avez
mvn
donné la réponse (comme le suggèrent la plupart des réponses), soit vous extrayez la réponse dupom.xml
. Le seul inconvénient de la deuxième approche est que vous pouvez extraire très facilement la valeur de la<version/>
balise, mais elle n'aura de sens que si elle est littérale , c'est-à-dire pas une propriété Maven. J'ai quand même choisi cette approche car:mvn
est un moyen de verbaliser et je n'aime tout simplement pas filtrer sa sortie.mvn
est très lent par rapport à la lecture dupom.xml
.<version/>
.mvn-version
est unzsh
script shell qui utilisexmlstarlet
pour lirepom.xml
et imprimer la version du projet (si elle existe) ou la version du projet parent (si elle existe):L'avantage est que c'est beaucoup plus rapide que de courir
mvn
:La différence sur ma machine est supérieure à deux ordres de grandeur.
la source
J'ai besoin exactement de cette exigence pendant mon travail Travis mais avec plusieurs valeurs. Je commence par cette solution mais lors de plusieurs appels, c'est très lent (j'ai besoin de 5 expressions).
J'ai écrit un simple plugin maven pour extraire les valeurs de pom.xml dans un fichier .sh.
https://github.com/famaridon/ci-tools-maven-plugin
Produira cela:
vous pouvez maintenant simplement source le fichier
S'amuser.
la source
J'utilise un one-liner dans ma coque unix ...
Vous pouvez masquer cette ligne dans un script shell ou en tant qu'alias.
la source
c'est un montage d'en haut
Je l'ai testé sur la cmdline qui fonctionne bien
grep "" pom.xml | tête -n 1 | sed -e "s / version // g" | sed -e "s / \ s * [<> /] * // g"
est une autre version du même. J'ai besoin d'obtenir le numéro de version dans Jenkins CI dans k8s sans mvn installé donc c'est très utile
Merci a tous.
la source
J'ajoute juste une petite
sed
amélioration de filtre que j'ai récemment implémentée pour extraireproject.version
de la sortie maven.la source
C'est ce que j'ai utilisé pour obtenir le numéro de version, je pensais qu'il y aurait eu un meilleur moyen maven de le faire
la source