Desde que comencé a utilizar Gradle en mis proyectos Java hace ya varios años, muchas han sido las tareas que he podido resolver con su ayuda.
Créanme cuando les digo que la administración de dependencias y la automatización de la construcción del proyecto, son tan solo un par de cosas de las muchas que podemos hacer con esta fabulosa herramienta. Y si no, pregúntenle al equipo de Microsoft. 😀
Sin embargo, una de las cosas que no había realizado era justamente automatizar el versionamiento del jar
Gradle Plugins
Al ser una actividad relativamente común, es natural pensar que ya ha sido resuelta por alguien. Y como yo no soy amigo de andar inventando la rueda, lógicamente me dí una vuelta por el catálogo de plugins de Gradle (https://plugins.gradle.org).
Como era de esperar, la lista de alternativas es bastante amplia.

Pero, les puedo decir que ni se molesten en revisarla. Personalmente me he pasado todo un día haciéndolo, e incluso probando muchos de los plugins y la verdad…
Ay, ya! Quien soy yo para quitarles la diversión.
Revísenla y pasen el rato, leyendo documentaciones escuetas y probando soluciones casi siempre complejas o incompletas.
Igual y luego me dejan en los comentarios lo que haya sido su experiencia.
Lo cierto es que, luego de haber invertido todo un día en ello, decidí que Einsten tenía razón cuando dijo:
«Everything should be made as simple as possible, but not simpler.»
Albert Einstein
Así que en lugar de seguir gastando tiempo en probar soluciones ajenas, pase a escribir la propia.
Mi solución
Mi propuesta es realmente simple, pero no por ello menos efectiva.
Definí la siguiente semántica de versionamiento:
[MajorVersion].[MinorVersion].[PatchVersion]-[LabelVersion]([BuildVersion])
Y coloqué en un archivo que nombré: version.properties las definiciones, incluyendo una definición UpgradeVersion que sirve para que podamos configurar el tipo de cambios que estamos realizando y una NoneVersion que utilizo para cuando no queremos que cambie la version.
Los valores validos para UpgradeVersion son:
- Major
- Minor
- Patch
- None
version.properties
LabelVersion=RC
MajorVersion=1
PatchVersion=1
UpgradeVersion=Patch
BuildVersion=1123
MinorVersion=5
NoneVersion=0
Luego, solo hice dos piezas de código:
Una con la cual recupero y uso los datos para construir el valor que configuro como version, la cual coloqué en el doFirst de la tarea compileJava
Y la otra con la cual realizo la actualización para la siguiente construcción, que coloqué en el doLast
Aquí, quiero hacer un alto para expresar mi agradecimiento a
Malini Kennady y James Justinic por mostrarme el camino…
How to change value in properties file from gradle build.
Malini Kennady
En resumidas cuentas, mi tarea compileJava quedó como les comparto en el archivo automatic-versioning.gradle
automatic-versioning.gradle
compileJava{
doFirst {
def propertyFile = file "/version.properties"
def props = new Properties()
propertyFile.withReader { props.load(it) }
print "Actual Version: "
version = props.getProperty('MajorVersion') + '.' + props.getProperty('MinorVersion') + '.' + props.getProperty('PatchVersion') + '-' + props.getProperty('LabelVersion') + '(' + props.getProperty('BuildVersion') + props.getProperty('MajorVersion') + props.getProperty('MinorVersion') + props.getProperty('PatchVersion') + ")"
println("version = ${version}")
}
doLast {
def propertyFile = file "/version.properties"
def props = new Properties()
propertyFile.withReader { props.load(it) }
print "Upgrade Version: "
println props.getProperty('UpgradeVersion') + "Version"
if(props.getProperty('UpgradeVersion')!="None") {
props.setProperty(props.getProperty('UpgradeVersion') + "Version", Integer.toString(Integer.parseInt(props.getProperty(props.getProperty('UpgradeVersion') + "Version"))+1))
}
props.setProperty("BuildVersion", Calendar.getInstance().get(Calendar.MONTH)+1 + "" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "" + Calendar.getInstance().get(Calendar.HOUR_OF_DAY))
propertyFile.withWriter { props.store(it, null) }
print "Next Version: version = "
propertyFile.withReader { props.load(it) }
println props.getProperty('MajorVersion') + '.' + props.getProperty('MinorVersion') + '.' + props.getProperty('PatchVersion') + '-' + props.getProperty('LabelVersion') + '(' + props.getProperty('BuildVersion') + props.getProperty('MajorVersion') + props.getProperty('MinorVersion') + props.getProperty('PatchVersion') + ")"
}
}
Solo tienen que colocar el fragmento de código del archivo automatic-versioning.gradle en su archivo build.gradle.
Y listo, se habrá hecho la magia.
Como les dije, simple pero efectivo.
Espero te haya parecido útil este artículo
No olvides visitarme en mi perfil de GitHub: https://github.com/era5mx en donde encontrarás esta solución y otras más.
………….
Quiero man.tener.me informado: Seguir en Twitter @eldavid_oficial https://twitter.com/eldavid_oficial
Regálame un ME GUSTA. Y si eres solidario, COMPARTE para que otros puedan aprovecharlo
Pingback: Automatic versioning jar with #Gradle build tool – Nettech Post