58 votes

Utilisation de Maven pour plusieurs environnements de déploiement (production / développement)

J'ai une application web avec Maven, avec la structure de répertoires par défaut. Pas de problème. La structure de répertoires par défaut a certains fichiers de propriété de ce point de ma base de données localhost.

Actuellement j'ai créer un script Ant pour créer différents fichiers war - l'une pour la production et un pour le développement, l'utilisation de ces commandes:

ant deploy-dev
ant deploy-prod
ant deploy-sit
ant deploy-uat

Donc, fondamentalement, ils créent un fichier war et ensuite mettre à jour le fichier war en le branchant dans le fichier de propriétés

Est-il quelque chose de semblable dans maven (différent de guerre créé en fonction de la configuration)?

si oui, comment dois-je faire?

j'ai essayé d' mvn war, mais il crée une guerre

75voto

Antony Stubbs Points 4236

Pour info la meilleure pratique est de ne pas avoir à reconstruire votre artefact pour des environnements différents - que qui ne conduit pas à re-produire-mesure construit, et d'autres choses qui seraient susceptibles d'être modifiées lors de la reconstruction. I. e. à l'aide des ressources de filtrage, comme suggéré ci-dessus, ne fonctionne que lors de la re-construction de votre projet.

Lorsque vous êtes diplômé d'un artefact de dev de test ou test d'acceptation à la production, vous ne voulez pas avoir à reconstruire.

Ce que vous voulez faire, est en fait avoir votre configuration dynamique, dépendant des variables d'exécution. I. e. différentes printemps des configurations ou des fichiers de propriétés pour les différents environnements de l'e.g:

db-dev.properties
db-test.properties
db-prod.properties

Ensuite, vous pouvez basculer entre ces configurations à l'aide d'exécution variables et du Printemps PropertyPlaceholderConfigurer.

Vous pouvez également utiliser différentes printemps fichiers de configuration ainsi, comme je l'ai fait dans le passé, pour des configurations plus complexes.

Je vous conseille aussi de laisser votre 'par défaut' installation de production de sorte que si vous déployez pour la production, vous n'avez pas besoin de vous inquiéter si vous oubliez de définir la variable d'environnement.

75voto

m1ld Points 230

Je préfère utiliser les profils Maven pour cette situation. Par exemple, nous avons une structure de répertoire:

src / main / resources
|
+ - local
| |
| `- specific.properties
+ - dev
   |
   `- specific.properties

Dans pom.xml, définissez deux profils:

 <profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/local</directory>
                </resource>
            </resources>
        </build>
    </profile>
    <profile>
        <id>dev</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources/dev</directory>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>
 

Dans ce cas, je n'ai pas besoin de mettre à jour chaque fois pom.xml pour les nouveaux fichiers. Dans l'EDI, changez simplement de profil ou utilisez -P flag depuis la ligne de commande.

20voto

Mike Cornell Points 2661

Si vous souhaitez supprimer les fourmis de votre processus, je regarde l'utilisation de créer des profils avec des filtres.

Dans ce scénario, branchez vos propriétés des fichiers dans le répertoire src/main/resources structure de l'arbre. Ensuite paramétrer le fichier de propriétés avec les propriétés de filtre comme ceci:

jdbc.url=${filtered.jdbc.property}

Puis à l'intérieur de la src/main/filtres pour créer des fichiers de filtre basé sur les profils. donc, vous pourriez avoir de la dev-filtres.propriétés sit-filtres.propriétés, etc. Ceux-ci contiennent:

filtered.jdbc.property=jdbc url here

Puis vous le programme d'installation de créer des profils pour chaque région où vous définissez un env propriété pointant vers la région de votre bâtiment. Vous pouvez ensuite le programme d'installation les ressources filtre à utiliser ${env}-filters.properties pour chaque construction. En outre, vous pouvez configurer la guerre plugin pour ajouter l'env de propriété de votre artefact de sorte que vous réellement le magasin 4 différents artefacts dans votre référentiel, sous un autre classificateur.

Il vous suffit alors de construire l'application à chaque profil. Vous devez appeler la construction pour chaque profil, mais il fonctionne bien.

Exemple de certains paramètres dans le POM:

<build>
  <filters>
    <filter>src/main/filters/filter-${env}-application.properties</filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.1-beta-1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>war</goal>
          </goals>
          <configuration>
            <classifier>${env}</classifier>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

<profiles>
  <profile>
    <id>LOCAL</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <env>LOCAL</env>
    </properties>
  </profile>
  <profile>
    <id>DEV</id>
    <properties>
      <env>DEV</env>
    </properties>
  </profile>
  <profile>
    <id>UAT</id>
    <properties>
      <env>UAT</env>
    </properties>
  </profile>
  <profile>
    <id>PROD</id>
    <properties>
      <env>PROD</env>
    </properties>
  </profile>
</profiles>

Aussi, des accessoires pour ce blog qui est l'endroit où je l'ai d'abord trouvé les étapes à suivre pour accomplir cette.

6voto

David Tinker Points 3386

J'ai géré cela en utilisant le PropertyPlaceholderConfigurer de Spring et en incluant des fichiers de propriétés sur le classpath et un sur le système de fichiers:

 <context:property-placeholder 
    location="classpath*:META-INF/spring/*.properties,file:myapp*.properties"/>
 

S'il y a un fichier myapp * .properties dans le répertoire en cours au démarrage de l'application (ou des tests sont exécutés, etc.), il remplacera les propriétés des fichiers cuits dans war / ear / what.

4voto

seth Points 18409

Il y a cet article à ce sujet sur maven 2 en utilisant des profils de build . Il semble que cela ne soit que des délégués à ant de toute façon via le plugin antrun, de sorte que vous pourriez même être en mesure de réutiliser vos fichiers build.xml existants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X