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 :

Ressources multi environnement


Sujet :

Maven Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Ressources multi environnement
    Bonjour,

    Maven suggère d'utiliser les profiles et "maven-antrun-plugin" pour gérer des ressources multi-environnement.

    Voici comment j'ai procédé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    src/main/ressources
    | messages.properties
    | platform.properties
    + production
      | platform.properties
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <build>
    	<plugins>
    		<plugin>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-antrun-plugin</artifactId>
    			<executions>
    				<execution>
    					<phase>prepare-package</phase>
    					<goals>
    						<goal>run</goal>
    					</goals>
    					<configuration>
    						<tasks>
    							<delete dir="${project.build.outputDirectory}/production" verbose="true" />
    						</tasks>
    					</configuration>
    				</execution>
    			</executions>
    		</plugin>
    	</plugins>
    </build>
    <profiles>
    	<profile>
    		<id>production</id>
    		<build>
    			<plugins>
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-antrun-plugin</artifactId>
    					<executions>
    						<execution>
    							<phase>prepare-package</phase>
    							<goals>
    								<goal>run</goal>
    							</goals>
    							<configuration>
    								<tasks>
    									<copy todir="${project.build.outputDirectory}" overwrite="true" failonerror="true" verbose="true">
    										<fileset dir="${project.build.outputDirectory}/production" />
    									</copy>
    									<delete dir="${project.build.outputDirectory}/production" verbose="true" />
    								</tasks>
    							</configuration>
    						</execution>
    					</executions>
    				</plugin>
    			</plugins>
    		</build>
    	</profile>
    </profiles>
    Et puis j'ai cherché un moyen plus "propre", plus simple de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    src/main/ressources/commons
    | messages.properties
    src/main/ressources/development
    | platform.properties
    src/main/ressources/production
    | platform.properties
    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
    <build>
    	<resources>
    		<resource>
    			<directory>src/main/resources/commons</directory>
    		</resource>
    		<resource>
    			<directory>src/main/resources/development</directory>
    		</resource>
    	</resources>
    </build>
    <profiles>
    	<profile>
    		<id>production</id>
    		<build>
    			<resources>
    				<resource>
    					<directory>src/main/resources/commons</directory>
    				</resource>
    				<resource>
    					<directory>src/main/resources/production</directory>
    				</resource>
    			</resources>
    		</build>
    	</profile>
    </profiles>
    Ca ne fonctionne pas, les ressources par défaut (development) sont copiés par dessus les ressources production.

    Y'a-t-il d'autres solutions ?

    Merci.

  2. #2
    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
    Bonjour,

    Je pense que ta 2e solution est plus propre qu'utiliser Ant (c'est mon point de vue).
    Tu peux éventuellement définir des exclusions dans les ressources, afin d'exclure effectivement les fichiers qui ne devraient pas être présents dans la release finale...
    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

  3. #3
    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
    Tout premièrement, il faut essayer de ne pas contenir la variabilité au niveau de l'artefact mais plutôt de la déporter au serveur d'application.
    L'idée est d'avoir un artefact générique acceptant en entrée des valeurs JNDI, des proprétés systèmes, … et c'est serveur d'application de développement, de recette, de production d'injecter les bons paramètres.
    Dans les applications standardisés JEE : oui c'est possible.
    Ainsi, Maven n'a été prévu pour gérer cela nativement.

    Dans tous les cas, il faut éviter au maximum l'utilisation du plugin maven-antrun-plugin quand on peut faire autrement.

    Ton problème d'écrasement vient du fait que tu a spécifié les ressources de développement en dehors d'un profile.
    Le contenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <build>
    	<resources>
    		<resource>
    	...
    		</resource>
    	</resources>
    </build>
    sera toujours pris en compte meme lors de l'activation d'un profile.

    Il te faut donc mettre ici que les ressources communes


    Puis réaliser un profile de développement et un profile de production avec respectivement que les ressources de développement et de production

    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
     
    <build>
    	<resources>
    		<resource>
    			<directory>src/main/resources/commons</directory>
    		</resource>
    	</resources>
    </build>
    <profiles>
    	<profile>
    		<id>dev</id>
    		<build>
    			<resources>
    			  <resource>
    				<directory>src/main/resources/development</directory>
    			  </resource>
    			</resources>
    		</build>
    	</profile>
     
     
    	<profile>
    		<id>production</id>
    		<build>
    			<resources>
    				<resource>
    					<directory>src/main/resources/production</directory>
    				</resource>
    			</resources>
    		</build>
    	</profile>
    </profiles>
    Juste dernière remarque, comme dans l'exemple du lien du site, ne pas oublier de surcharger le plugin maven-jar-plugin avec un classifier de type 'dev' ou 'prod' pour bien identifier en terme de traçabilité au niveau du nom s'il s'agit d'un artefact de développement ou de production.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gboissinot Voir le message
    Tout premièrement, il faut essayer de ne pas contenir la variabilité au niveau de l'artefact mais plutôt de la déporter au serveur d'application.
    L'idée est d'avoir un artefact générique acceptant en entrée des valeurs JNDI, des proprétés systèmes, … et c'est serveur d'application de développement, de recette, de production d'injecter les bons paramètres.
    Dans les applications standardisés JEE : oui c'est possible.
    Ainsi, Maven n'a été prévu pour gérer cela nativement.
    Je comprends cette "philosophie", mais je n'ai pas encore les compétences JNDI. Les seuls fichiers qui diffèrent selon l'environnement sont log4j.xml et platform.properties (utilisé via Spring). Pour l'instant la couche web n'est pas développée et l'application pourrait fonctionner sans serveur d'application. Si tu as des pistes pour m'aiguiller, n'hésite pas. Merci.

  5. #5
    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
    Est-ce que tu sais précisément quels sont les éléments des fichiers log4j.xml et platform.xml qui varient?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gboissinot Voir le message
    Est-ce que tu sais précisément quels sont les éléments des fichiers log4j.xml et platform.xml qui varient?
    Les fichiers log4j sont très différents :
    • development : ConsoleAppender DEBUG
    • integration : DailyRollingFileAppender DEBUG
    • production : DailyRollingFileAppender / AsyncAppender INFO + SMTPAppender ERROR


    Cela dit, il est peut-être possible de les rendre plus similaires en déclarant tous les appenders, et en activant ou désactivant ceux qui nous intéressent selon l'environnement.

    Le fichier platform.properties est (pour l'instant) plus succint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    db.url=jdbc:postgresql://localhost:5432/dbname
    db.user=dbuser
    db.password=dbpasswd
    db.debug=true
    Bien que ce ne soit pas le sujet du topic, la solution JNDI m'intéresse car elle permettrait d'externaliser les informations confidentielles (identifiants, e-mails) de notre projet, dans le cas d'un éventuel passage à l'open-source.

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Août 2007
    Messages : 84
    Par défaut
    Je modifierai simplement comme ceci:

    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/commons</directory>
    		</resource>
    	</resources>
    </build>
    <profiles>
    	<profile>
    		<id>production</id>
    		<build>
    			<resources>
    				<resource>
    					<directory>src/main/resources/production</directory>
    				</resource>
    			</resources>
    		</build>
    	</profile>
            <profile>
    		<id>development</id>
                    <activeByDefault>true</activeByDefault>
    		<build>
    			<resources>
    				<resource>
    					<directory>src/main/resources/development</directory>
    				</resource>
    			</resources>
    		</build>
    	</profile>
    </profiles>
    Lancer avec aucun profile activera les resources commons + development, lancer avec -Pproduction activera les resources commons + production.

    Et c'est tout propre en plus

  8. #8
    Invité de passage
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 1
    Par défaut et les filters ?
    Bonjour,

    si ca peut aider pour les paramètres tel que jndi / chemins ... j'utilise plutôt les filtres (filters)

    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <build>
    	<filters>
    	  <filter>src/main/filters/properties-${env}.properties</filter>
    	</filters>
            ...
    avec des profiles définis tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      		<id>dev</id>
      		<activation>
      			<activeByDefault>true</activeByDefault>
      		</activation>
      		<properties>
    	  		<env>dev</env>
    		</properties>
    la reference est la : http://maven.apache.org/guides/getti...resource_files

    cdlt,
    marc

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Tomekaa Voir le message
    Je modifierai simplement comme ceci:

    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/commons</directory>
    		</resource>
    	</resources>
    </build>
    <profiles>
    	<profile>
    		<id>production</id>
    		<build>
    			<resources>
    				<resource>
    					<directory>src/main/resources/production</directory>
    				</resource>
    			</resources>
    		</build>
    	</profile>
            <profile>
    		<id>development</id>
                    <activeByDefault>true</activeByDefault>
    		<build>
    			<resources>
    				<resource>
    					<directory>src/main/resources/development</directory>
    				</resource>
    			</resources>
    		</build>
    	</profile>
    </profiles>
    Lancer avec aucun profile activera les resources commons + development, lancer avec -Pproduction activera les resources commons + production.

    Et c'est tout propre en plus
    Parfait ! Merci.
    Quelques notions m'avaient échappé (build par défaut, activation par défaut), mais maintenant c'est enregistré.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/01/2013, 18h02
  2. Avis pour cryptographie multi-environnement
    Par vince29 dans le forum Sécurité
    Réponses: 0
    Dernier message: 24/06/2011, 12h43
  3. Ressources multi sites
    Par mafyoso dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/01/2008, 16h59
  4. Ressources multi langues
    Par Papy214 dans le forum Visual Studio
    Réponses: 3
    Dernier message: 14/12/2007, 12h47
  5. environnement multi-utilisateurs.(Tables verrouillées)
    Par bsiouakam dans le forum Access
    Réponses: 2
    Dernier message: 24/09/2006, 13h31

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