sto guardando ristrutturazione di un grande progetto di Maven ...Maven consulenza in materia di controllo delle versioni di un grande progetto e la prevenzione delle versioni contenenti espressioni
Una panoramica di base del nostro attuale struttura:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-beta12-SNAPSHOT
server-utils:6.0.0.0-beta12-SNAPSHOT
...
CMW Root:6.0.0.0-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-beta12-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-beta12-SNAPSHOT
...
il motivo per il cambiamento:
la dimensione di ogni modulo collettiva (cioè NRW Utils, CMW radice e NRW Root) è sempre più grande e la Buil d processo sta iniziando a prendere una quantità insopportabile di tempo (~ 4 ore a volte).
Il nuovo piano:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
Abbiamo iniziato l'introduzione di 'chiavi' nella versione di distinguere tra diversi 'moduli collettivi' e quindi possono facilmente eseguire versioni a gradini. Inoltre, i nostri moduli di utilità sono molto più stabili, quindi potremmo non richiedere quasi tutte le versioni beta - ora non vi è alcuna restrizione sulla sincronizzazione dei numeri beta.
Vale anche la pena notare che ci sono in realtà 5 diversi "moduli collettivi" (non solo 3) tutti da costruire con diverse versioni (contraddistinte da chiavi uniche) ed è per questo che ho pensato che sarebbe stato bello avere un luogo centralizzato per le versioni, al contrario delle proprietà duplicate in 5 POM differenti.
Il problema si trova ora nel contenuto dei file POM quando si definiscono dipendenze su moduli in un diverso 'modulo collettivo' di una versione diversa.
La soluzione proposta alla dipendenza la gestione delle versioni:
build [MVN plugins, third party dependency management]:5.1
nrw-version-management:6.0.0.0-beta-SNAPSHOT
[contains properties defining latest versions of each collective module]
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
NRW-versione-management (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>build</artifactId>
<version>5.1</version>
</parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>6.0.0.0-beta-SNAPSHOT</version>
<name>Version Maven Properties</name>
<description>A centralised place for all module property versions</description>
<packaging>pom</packaging>
<properties>
<nrw.utilities.version>6.0.0.0-NU-beta4-SNAPSHOT</nrw.utilities.version>
<nrw.cmw.version>6.0.0.0-CMW-beta12-SNAPSHOT</nrw.cmw.version>
<nrw.version>6.0.0.0-NRW-beta9-SNAPSHOT</nrw.version>
</properties>
...
CMW Root (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>${nrw.core.version}</version>
...
</parent>
<groupId>com.project</groupId>
<artifactId>CMW-root</artifactId>
<version>6.0.0.0-CMW-beta12-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>server-utils</artifactId>
<version>${nrw.utilities.version}</version>
</dependency>
...
</dependencyManagement>
<profiles>
<profile>
<id>all</id>
<modules>
<module>cmw-webapp</module>
<module>cmw-core</module>
...
</modules>
</profile>
...
</profiles>
...
N.B. la proprietà $ {nrw.core.version} sarà quindi impostata su 6.3.0.0-beta-SNAPSHOT per una build di istantanee tramite argomenti della riga di comando (o un valore di proprietà predefinito).
Un processo di rilascio possibile (per 6.0.0.0):
- compilare il modulo 5.1 Build, se non già costruito
- Corporatura NRW-versione-gestione 6.0.0.0 (per evitare le dipendenze istantanee - tuttavia immobili sono ancora stati cambiati)
- Corporatura NRW Utils 6.0.0.0-NU args cmd: -Dnrw.core.version = 6.0.0.0
- costruire CMW Root 6.0.0.0-CMW args cmd: -Dnrw. core.versi on = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU
- Build NRW Root 6.0.0.0-NRW cmd args: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0 .0.0-NU -Dnrw.cmw.version = 6.0.0.0-CMW
- Re-build nrw-version-management 6.0.0.0 per repository cmd args: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU -Dnrw.cmw. versione = 6.0.0.0-CMW
- Build-versione-gestione nrw 6.1.0.0-beta-SNAPSHOT con le nuove versioni dev e file di aggiornamento POM
Il problema:
Il processo di generazione sembra prolisso, in particolare per quanto riguarda il modulo di gestione della versione nrw. Inoltre, ho iniziato a vedere questo avvertimento:
'versione' contiene un'espressione, ma dovrebbe essere una costante
E dopo aver fatto qualche indagine ora capisco le espressioni non sono raccomandati quando si impostano le versioni (quando si specifica un POM genitore):
- Warning on using project.parent.version as the version of a module in Maven 3
- Maven: property substitution not done for /project/version tag of pom?
- http://maven.40175.n5.nabble.com/Pom-Parent-Version-Properties-td124576.html
Le domande:
- Posso ignorare questo avviso? Alcuni post stanno iniziando a suggerire che potrebbe essere semplicemente accettabile specificare le versioni padre POM usando le proprietà.
- Questo approccio generale è convenzionale? O imperfetto?
- Ci sono soluzioni migliori per affrontare la ristrutturazione di questo progetto in crescita?
Grazie in anticipo.
Grazie per l'input. La ragione per cui ci stiamo allontanando da una singola versione è che senza questo vincolo sarà molto più facile spezzare la nostra build in blocchi "bitesize", con il vantaggio aggiunto della semplicità; ora non abbiamo bisogno di creare di nuovo tutto se un modulo ha un aggiornamento. Altri pensieri/modi per aggirare ciò nonostante con una singola versione? Grazie. –
Otterrete i blocchi bitesize condividendo un repository per i vostri artefatti. Bisogna riconoscere che devi costruire l'intero progetto quando aggiorni il numero di versione, ma dopo di ciò puoi solo costruire e distribuire i moduli dove c'è stato uno sviluppo./oskar – lambda64
Hmmm - ma stiamo già utilizzando un repository per gli artefatti costruiti.E lasciare la build su una singola versione significa ancora che dobbiamo costruire il progetto come uno, il che ci lascia con il processo di compilazione che richiede molto tempo (4 ore). Inoltre i nostri numeri di versione cambiano frequentemente (quando solo alcuni moduli lo causano). –