Anteriormente emití una pregunta sobre cómo cambiar la versión del proyecto Maven desde la línea de comandos que me llevó a un nuevo problema.
Anteriormente pude obtener el número de versión ya que la versión se almacenaba como una propiedad que era fácil de seleccionar y analizar desde la línea de comandos (bash). Ahora que el elemento pom.xml se usa para esto, ya no es único ya que todas las dependencias y tal vez otros también lo usan. Creo que no hay forma de obtener el número de versión actual con un script bash sin herramientas externas para analizar xml o algún comando sed muy sensible al contexto.
La solución más limpia en mi opinión sería que Maven entregue la información de esta versión. Estaba pensando en escribir un complemento Maven personalizado para recuperar diferentes propiedades, pero pensé en preguntar aquí primero.
Entonces, ¿hay alguna manera fácil de obtener el valor de ${project.version}
la línea de comando? Gracias por adelantado.
Solución
Gracias por la ayuda. Tuve que cd
ir al directorio manualmente, pero eso se puede hacer fácilmente. En mi script bash tengo
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 } }'`
Lo que me da la versión actual que luego puedo avanzar. El grepping podría ser más simple, pero pensé que me gustaría lo más robusto posible, así que estoy satisfecho con la primera línea que comienza con un número y trato de manejarlo como un número de versión.
# 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/"
}
Y uso esto simplemente llamando
new_version=$(advance_version $version)
Espero que esto ayude a alguien.
fuente
grep -e '^[[:digit:]]'
Respuestas:
El complemento de ayuda de Maven de alguna manera ya está proponiendo algo para esto:
Así es como lo invocarías en la línea de comando para obtener
${project.version}
:fuente
[INFO]
mensajes? No encontré un interruptor para Maven. De lo contrario, solo agregaré algunos scripts de línea de comandos para analizar el número de versión.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 capturarlo en una variable en Bash useversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
La solución de Tom con Exec Maven Plugin es mucho mejor, pero aún más complicada de lo necesario. Para mí es tan simple como:
fuente
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
encogerse de hombros otra respuesta que no funciona para mí, oh bienset -o errexit
He estado investigando y encontré lo siguiente:
Se ha culpado a Maven porque la integración con las herramientas DevOps no es fácil debido al hecho de que no sigue algunas buenas prácticas con respecto a las herramientas CLI. (ref: https://youtu.be/1ILEw6Qca3U?t=372 )
Inspirado en la afirmación anterior, decidí echar un vistazo al código fuente de maven, así como a maven-help-plugin. Parece que han solucionado un poco el modificador -q de maven (estoy usando la versión 3.5.3), por lo que ahora si lo pasa, no obtendrá todas las cosas molestas de registro sin sentido que evitan que se use maven dentro de guiones automatizados. Entonces deberías poder usar algo como esto:
El problema es que este comando no imprime nada porque, de forma predeterminada, el complemento de ayuda sale a través del registrador que ha sido silenciado por el modificador -q. (la última versión disponible del complemento es la 3.1.0 lanzada el 3 de junio de 2018)
Karl Heinz Marbaise https://github.com/khmarbaise ) lo arregló agregando un parámetro opcional que le permite llamarlo de la siguiente manera:
La descripción de confirmación está disponible en: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )
fuente
-q
interruptor, imprime la versión correctamente (entre las líneas de registro). ¿Algunas ideas?-q
interruptor.-q -DforceStdout
estaba vacía, incluso asegurando que la versión 3.1.0 del complemento se utilizó con pluginManagement); configuré maven wrapper con la versión 3.5.4 de maven, y funcionó correctamentefuente
2> /dev/null
, de lo contrario puede obtenerPicked up _JAVA_OPTIONS:
| findstr /v "["
.La respuesta principal es bastante basura en mi opinión, tienes que usar un montón de grep para hackear la salida de la consola maven. ¿Por qué no usar la herramienta adecuada para el trabajo? El uso de la sintaxis xpath es el mejor enfoque para recuperar el número de versión, ya que es el método previsto para acceder a una estructura de datos XML. La siguiente expresión está atravesando el pom utilizando el "nombre local" de los elementos, en otras palabras, ignorando las declaraciones de espacios de nombres que pueden o no estar presentes en el xml.
fuente
mvn
es el enfoque correcto y elexec
complemento realmente funciona bien, pero todas las soluciones mvn tienen que resolverse y estoy tratando de arrancar una tubería de compilación donde la resolución de dependencia no funcionará, así que voy a reemplazar elexec
enfoque con esta solución. Afortunadamente, no tengo que preocuparme por las versiones heredadas de los padres.${revision}
por ejemplo. Árbitro. maven.apache.org/maven-ci-friendly.htmlEsto evitará la necesidad de extraer entradas de registro de la salida:
fuente
Esta es la solución más limpia que encontré:
Ventajas:
pom.xml
Nota:
maven-help-plugin
La versión3.2.0
(y superior) tieneforceStdout
opción. Puede reemplazar el3.2.0
comando anterior con una versión más nueva de la lista de versiones disponibles de mvn-help-plugin de artifactory, si está disponible.-q
suprime los mensajes detallados ([INFO]
,[WARN]
etc.)Si desea buscar
groupId
yartifactId
también, verifique esta respuesta .fuente
Mientras tenga Python 2.5 o superior, esto debería funcionar. Si tiene una versión inferior, instale
python-lxml
y cambie la importación a lxml.etree. Este método es rápido y no requiere descargar ningún complemento adicional. También funciona en archivos pom.xml mal formados que no se validan con xmllint, como los que necesito analizar. Probado en Mac y Linux.fuente
Seguí encontrando casos secundarios al usar algunas de las otras respuestas aquí, así que aquí hay otra alternativa.
fuente
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
Si no le importa escribir la versión en un archivo temporal, hay otra solución (sin grep / sed) que me funciona bien. ( EDITAR : ver la respuesta de rjrjr para obtener una solución mucho más simple sin problemas de archivos temporales)
Yo uso el complemento Exec Maven junto con el
echo
binario. A diferencia del complemento de ayuda de Maven, el complemento de Exec permite la redirección de salida a un archivo, que se puede utilizar para omitir grep / sed, y hace posible incluso analizar cosas extrañas como cadenas de versión multilínea (con bloque CDATA en la etiqueta de versión), al menos hasta cierto punto.fuente
Solo para el registro, es posible configurar el registro Simple SLF4J de Maven directamente en la línea de comando para generar solo lo que necesitamos configurando:
org.slf4j.simpleLogger.defaultLogLevel=WARN
yorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO
como se documenta en http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Como resultado, uno puede correr simplemente
tail -1
y obtener:Tenga en cuenta que esta es una línea.
MAVEN_OPTS
se reescriben solo para estamvn
ejecución particular .fuente
Noté algunas
Downloaded:
líneas espurias entrando en la salida que estaban rompiendo mi asignación original. Aquí está el filtro en el que me he decidido; ¡Espero eso ayude!EDITAR
No estoy 100% seguro de por qué, pero al ejecutar esto a través de un script posterior a la compilación en Jenkins, el resultado salía como
[INFO]version
, por ejemplo[INFO]0.3.2
.Volqué la salida a un archivo y lo ejecuté a través de mi primer filtro directamente desde BASH, funciona bien ..., así que de nuevo, no estoy seguro de lo que está sucediendo en la tierra de Jenkins.
Para obtener el 100% en Jenkins, he agregado un
sed
filtro de seguimiento ; Aquí está mi últimoEDITAR
Una última nota aquí .. descubrí
tr
fue aún resultando en cosas como/r/n0.3.2
(de nuevo sólo cuando se ejecuta a través de Jenkins). ¡Cambiéawk
y el problema desapareció! Mi resultado de trabajo finalfuente
Una solución simple solo para expertos
Y para puntos de bonificación analizados parte de una versión
fuente
Recientemente desarrollé el complemento Release Candidate Maven que resuelve este problema exacto para que no tenga que recurrir a ningún script de shell hacky y analizar la salida del
maven-help-plugin
.Por ejemplo, para imprimir la versión de su proyecto Maven en una terminal, ejecute:
que da una salida similar a
maven-help-plugin
:Sin embargo, también puede especificar un formato de salida arbitrario (para que un servidor de CI como TeamCity pueda recoger la versión del registro ):
Lo que resulta en:
Para guardar la salida en un archivo (para que un servidor CI como Jenkins pueda usarlo ):
El
version.properties
archivo resultante tendrá el siguiente aspecto:Además de todo lo anterior, Release Candidate también le permite configurar la versión de su proyecto (que es algo que probablemente haría en su servidor CI) en función de la versión de API que ha definido en su POM.
Si desea ver un ejemplo de Release Candidate que se usa como parte del ciclo de vida de Maven, eche un vistazo a
pom.xml
mi otro proyecto de código abierto: Build Monitor for Jenkins .fuente
También hay una opción sin necesidad de Maven:
fuente
grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2p
Para obtener el uso de la tercera aparición:grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p
y así sucesivamenteLa solución todo en uno fácil de entender que genera la versión del proyecto maven y suprime los resultados
[INFO]
yDownload
mensajes extraños :Lo mismo, pero dividido en dos líneas:
Salidas:
4.3-SNAPSHOT
Entonces, usando su
project.version
en un script bash simple:Otras soluciones en esta página no parecen combinar todos los trucos en uno.
fuente
Debería ser más fácil ya que este error se solucionó en maven-help-plugin 3.0.0: MPH-99 Evaluate no tiene salida en modo silencioso .
fuente
Esta es, con mucho, la solución más fácil para cortar y pegar bash:
hace eco
fuente
Encontré el equilibrio adecuado para mí. Después
mvn package
de que el complemento maven-archiver creetarget/maven-archiver/pom.properties
con contenidos como estey estoy usando bash solo para ejecutarlo
luego
Por supuesto, esto no es seguro en absoluto para ejecutar este archivo, pero la ejecución se puede convertir fácilmente en script perl o bash para leer y establecer la variable de entorno desde ese archivo.
fuente
Esto funcionó para mí, sin conexión y sin depender de mvn:
fuente
El complemento Exec funciona sin ningún análisis de salida porque la salida se puede redirigir al archivo e inyectar nuevamente en el entorno de trabajo a través del complemento EnvInject:
fuente
Basándome en la pregunta, uso este script a continuación para aumentar automáticamente mi número de versión en todos los submódulos / padres principales de maven:
fuente
O le ha
mvn
dado la respuesta (como sugiere la mayoría de las respuestas), o extrae la respuesta delpom.xml
. El único inconveniente del segundo enfoque es que puede extraer fácilmente el valor de la<version/>
etiqueta, pero será significativo solo si es literal , es decir, no es una propiedad de Maven. Elegí este enfoque de todos modos porque:mvn
es una manera detallada y simplemente no me gusta filtrar su salida.mvn
es muy lento en comparación con la lectura depom.xml
.<version/>
.mvn-version
es unzsh
script de shell que se utilizaxmlstarlet
para leerpom.xml
e imprimir la versión del proyecto (si existe) o la versión del proyecto principal (si existe):La ventaja es que es mucho más rápido que correr
mvn
:La diferencia en mi máquina es mayor que dos órdenes de magnitud.
fuente
Necesito exactamente este requisito durante mi trabajo en Travis pero con múltiples valores. Empiezo con esta solución pero cuando llamo varias veces, esto es muy lento (necesito 5 expresiones).
Escribí un complemento Maven simple para extraer los valores de pom.xml en el archivo .sh.
https://github.com/famaridon/ci-tools-maven-plugin
Producirá eso:
ahora puedes simplemente obtener el archivo
Que te diviertas.
fuente
Estoy usando una línea en mi shell de Unix ...
Puede ocultar esta línea en un script de shell o como un alias.
fuente
esta es una edición desde arriba
Lo probé en cmdline funciona bien
grep "" pom.xml | cabeza -n 1 | sed -e "s / versión // g" | sed -e "s / \ s * [<> /] * // g"
Es otra versión de la misma. Tengo la necesidad de obtener el número de versión en Jenkins CI en k8s sin mvn instalado, así que esto es de gran ayuda
gracias a todos.
fuente
Solo estoy agregando una pequeña
sed
mejora de filtro que he implementado recientemente para extraerproject.version
de la salida de Maven.fuente
Esto es lo que solía obtener el número de versión, pensé que habría sido una mejor manera de hacerlo
fuente