Posso impostare la versione del progetto con un buildnumber-maven-plugin?
-
22-07-2019 - |
Domanda
Sto cercando di aggiungere svn.revision alla versione del progetto come numero di build e non riesco a farlo. Il mio vaso ha il nome corretto durante il packaging, ma è installato nel mio repository locale è come se $ {buildNumber} fosse / non fosse definito quando è stata impostata la versione.
Ricevo foo-1.0.0-SNAPSHOT- $ {buildNumber} invece di foo-1.0.0-SNAPSHOT- 304
Qualche idea su cosa stia facendo di sbagliato o aggiungere una revisione alla versione del progetto è una cattiva idea? Grazie per l'aiuto.
<project>
...
<version>1.0.0-${release.identifier}-${buildNumber}</version>
<properties>
<release.identifier>SNAPSHOT</release.identifier>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<executions>
<execution>
<id>useLastCommittedRevision</id>
<goals>
<goal>create</goal>
</goals>
<configuration>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</project>
Soluzione
Il problema ha due parti:
-
Stai tentando di impostare
buildNumber
nella versione prima che venga risolta, quindi sarà sempre$ {buildNumber}
anziché il valore risolto.Invece di provare a cambiare dinamicamente la versione, dovresti impostare
buildNumber
nell'elementofinalName
nella build. Ciò creerà gli artefatti con il nome previsto nel repository locale. -
Il plugin di installazione ignorerà il
finalName
e lo distribuirà come1.0.0-SNAPSHOT
a prescindere, non conosco un modo per affrontarlo.buildNumber
viene aggiunto a Manifest se si configura il plug-in come di seguito.Quindi la tua configurazione sarebbe simile a:
<version>1.0.0-${release.identifier}</version> ... <build> <finalName>${project.artifactId}-${project.version}-${buildNumber}</finalName> ... </build>
Eviterei di usare i numeri di build nei progetti SNAPSHOT
.
Maven fornisce la parola chiave SNAPSHOT
per indicare un progetto volatile in sviluppo attivo. Quindi, se fai riferimento a un progetto con una versione di dipendenza SNAPSHOT
, Maven controllerà automaticamente la presenza di aggiornamenti e manterrà sincronizzate le tue dipendenze.
Se poi aggiungi un numero di build alla fine di quella versione, dovrai aggiornare manualmente le dipendenze, in modo da perdere qualsiasi vantaggio derivante dal suffisso SNAPSHOT
.
Evito personalmente di utilizzare i numeri di build, ove possibile, comunque. Se devo aggiornare un progetto, devo solo aumentare il numero della versione o usare un suffisso come beta-2
o RC2
. Se devi tenere traccia della revisione nel SNAPSHOT
, ti consiglio di aggiungerla al Manifest in modo da poter controllare dove ha avuto origine la build, ma utilizzare il suffisso SNAPSHOT
standard per consentire a Maven di risolvere normalmente le versioni. La configurazione seguente mostra come aggiungere la revisione a Manifest.
Per quanto riguarda la tua configurazione, mi sembra OK supponendo che l'URL di SCM sia impostato correttamente. Se non hai una configurazione SCM nel tuo POM, questo potrebbe essere il problema.
È possibile eseguire con -X
e verificare l'eventuale output dal plug-in che indica perché non sta impostando la proprietà?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>0.9.4</version>
<executions>
<execution>
<id>useLastCommittedRevision</id>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Implementation-Build>${buildNumber}</Implementation-Build>
</manifestEntries>
</archive>
</configuration>
</plugin>
Altri suggerimenti
Aggiungilo dopo il buildnumber-maven-plugin
:
<plugin>
<groupId>io.github.michaldo</groupId>
<artifactId>nashorn-maven-plugin</artifactId>
<version>0.0.1</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>eval</goal>
</goals>
<configuration>
<script>
$project.artifact.version = "${buildNumber}";
</script>
</configuration>
</execution>
</executions>
</plugin>
E il buildNumber
verrà riconosciuto dall'imballaggio e dalla distribuzione.