IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Maven Java Discussion :

Filtre et date du jour


Sujet :

Maven Java

  1. #1
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut Filtre et date du jour
    Hello,

    Dans un projet Mavenisé, je filtre un fichier de propriétés, où j'insère - entre autre - la version et la date du build.
    Du coup, j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client.version=Version ${project.version}
    client.build=tut tut
    Vous l'avez compris, j'aimerais savoir quoi écrire à la place de tut tut pour qu'il me mette la date du jour (i.e. la date à laquelle Maven2 construit mon artifact)...
    Une idée ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 350
    Par défaut
    Hello Romain,

    Pour avoir la date de construction de l’artefact, il va falloir s’appuyer sur un plugin Maven qui fixe la valeur à une variable et c’est cette variable qui sera utilisé dans le fichier de propriété.

    Une première solution
    Utiliser le buildnumber-maven-plugin de codehaus et le rattacher à la phase validate du cycle de vie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
       <build>
          <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
          </resources>
     
          <plugins>
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>buildnumber-maven-plugin</artifactId>
                <configuration>
                   <format>{0,date,yyyyMMdd-HH:mm:ss}</format>
                   <items>
                      <item>timestamp</item>
                   </items>
                </configuration>
                <executions>
                   <execution>
                      <phase>validate</phase>
                      <goals>
                         <goal>create</goal>
                      </goals>
                   </execution>
                </executions>
             </plugin>
          </plugins>
       </build>
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client.version=${pom.version}
    client.build=${buildNumber}
    Deuxième solution
    Utiliser le plugin groovy de Maven et de setter la variable du timestamp en script groovy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
       <build>
          <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
          </resources>
          <plugins>
             <plugin>
                <groupId>org.codehaus.groovy.maven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <executions>
                   <execution>
                      <phase>validate</phase>
                      <goals>
                         <goal>execute</goal>
                      </goals>
                      <configuration>
                         <source>
                         import java.util.Date 
                         import java.text.MessageFormat 
                         def vartimestamp = MessageFormat.format("{0,date,yyyyMMdd-HH:mm:ss}", new Date()) 
                         project.properties['buildtimestamp'] = vartimestamp
                         </source>
                      </configuration>
                   </execution>
                </executions>
             </plugin>
          </plugins>
       </build>
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client.version=${pom.version}
    client.build=${buildtimestamp}
    Troisième solution
    Mais comme je te sais fervent utilisateur de Hudson, il est possible que tu adosses ton script Maven à Hudson. Et dans ce cas, on peut souhaiter avoir comme date du buid, non pas la date de l’invocation de build Maven mais la date du job Hudson qui orchestre ton script Maven avec aussi sûrement autre chose, conduisant a avoir un possible écart entre les dates du job Hudson et la date de l’invocation du script Maven.
    Il faut donc utiliser la valeur de la variable d’environnement BUILD_ID fournit par Hudson.

    On peut donc avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       <build>
          <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
          </resources>
       </build>
     
       <properties>
          <buildtimestamp>${BUILD_ID}</buildtimestamp>
       </properties>
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client.version=${pom.version}
    client.build=${buildtimestamp}
    Quatrième solution
    Mais comme l’objectif est d’avoir un script Maven indépendant de la chaîne d’intégration continue, je te conseillerais la solution suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
       <build>
          <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
          </resources>
     
          <plugins>
             <plugin>
                <groupId>org.codehaus.groovy.maven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <executions>
                   <execution>
                      <phase>validate</phase>
                      <goals>
                         <goal>execute</goal>
                      </goals>
                      <configuration>
                         <source>
                         import java.util.Date 
                         import java.text.MessageFormat 
                         def vartimestamp = null 
                         def env = System.getenv() 
                         if ((vartimestamp=env['BUILD_ID'])==null){ 
                         	vartimestamp = MessageFormat.format("{0,date,yyyyMMdd-HH:mm:ss}", new Date()) 
                         } 
                         project.properties['buildtimestamp'] = vartimestamp
                         </source>
                      </configuration>
                   </execution>
                </executions>
             </plugin>
          </plugins>
       </build>
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client.version=${pom.version}
    client.build=${buildtimestamp}
    Et dans le cas de Hudson, si tu veux changer le format de la date, il te faut utiliser le plugin zentimestamp .

  3. #3
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Hello,

    Merci pour toutes ces précisions ! Voilà qui est complet...
    Je souhaite effectivement ne pas avoir recours à Hudson, vu que je builde "manuellement" les releases (mais bon, je ferais évoluer tout ça peut-être un jour...).

    Bon, j'avoue que j'espérais une solution plus simple, mais c'est déjà pas mal !

    ps : Tu triches, les solutions 2 et 4 sont les mêmes (ou alors j'ai raté un truc)
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 350
    Par défaut
    La deuxième et la quatrième solution ne sont pas complètement identique. Certes, ces deux solutions utilisent le plugin groovy de Maven mais la quatrième solution test si la valeur de la variable d'environnement Hudson BUILD_ID est présente. Avec cette solution, si tu appelles ton script Maven manuellement, il prendra la date d'exécution du script. Et si ce script est exécuté à travers Hudson, il prendra la date d'exécution du job Hudson qui peut être différente de la date d'exécution du script Maven à cause d'opérations supplémentaires (mise a jour de l'espace de travail par rapport au SCM, opérations d'initialisation, …)

    Concernant la complexité des solutions, je ne pense pas que l'on puisse obtenir de solutions plus simples de Maven. De part son architecture, nous sommes obliger de passer par un mécanisme de plugins réalisant le travail.
    Le seul regret c'est qu'effectivement, ce travail de récupération de la date d'exécution ne soit pas fournit par un plugin core rattaché à chaque cycle de vie pour tous les types de packaging jar, war, … permettant d'avoir accès à tout moment à sa valeur par un expression de type ${execution.timestamp}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Filtres élaborés et Date du jour
    Par graphikris dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/01/2013, 20h15
  2. [XL-2007] VB - TCD - Filtre de rapport - Date du jour
    Par anthooooony dans le forum Excel
    Réponses: 1
    Dernier message: 24/08/2012, 14h46
  3. [VxiR2] Filtre sur date du jour dans une requête
    Par niko8181 dans le forum Webi
    Réponses: 5
    Dernier message: 05/10/2009, 15h39
  4. [VxiR2] [Webi] Filtre date du jour
    Par Luchs dans le forum Webi
    Réponses: 2
    Dernier message: 27/02/2009, 13h17
  5. Filtre sur date du jour + date du jour+1
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/05/2007, 07h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo