Uso de Maven para entornos de despliegue múltiple (producción / desarrollo)

Tengo una aplicación web en Maven, con la estructura de directorio predeterminada. No hay problema allí. La estructura de directorios predeterminada tiene algunos archivos de propiedades que apuntan a mi base de datos localhost.

Actualmente creo un script Ant para crear diferentes archivos war, uno para producción y otro para desarrollo, utilizando estos comandos:

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

Básicamente, crean un archivo de guerra y luego actualizan el archivo de guerra insertando el archivo de propiedades

¿Hay algo así en maven (se crean diferentes guerras según la configuración)?

si es así, ¿cómo hago eso?

Intenté la mvn war pero solo crea una guerra

La mejor práctica para tu información personal es no tener que reconstruir tu artefacto para diferentes entornos, ya que eso no conduce a la reconstrucción de construcciones capaces, y otras cosas podrían cambiar al reconstruir. Es decir, utilizando el filtrado de recursos, como se sugirió anteriormente, solo funciona al reconstruir su proyecto.

Cuando se gradúa un artefacto de desarrollo a prueba o prueba de aceptación a producción, no se debe tener que reconstruir.

Lo que quiere hacer es tener su configuración dinámica, dependiendo de las variables de tiempo de ejecución. Es decir, diferentes configuraciones de spring o archivos de propiedades para diferentes entornos, por ejemplo:

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

Luego puede cambiar entre estas configuraciones usando variables de tiempo de ejecución y PropertyPlaceholderConfigurer de Spring.

También puede usar diferentes archivos de configuración de spring, como lo hice en el pasado, para configuraciones más complejas.

También sugiero que deje su configuración ‘predeterminada’ como producción, de modo que si despliega en producción, no necesita preocuparse si olvida establecer la variable de entorno.

Prefiero usar perfiles maven para esta situación. Por ejemplo, tenemos estructura de directorio:

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

En pom.xml define dos perfiles:

   local  true     src/main/resources/local      dev    src/main/resources/dev      

En ese caso, no necesito actualizar cada vez pom.xml para nuevos archivos. En IDE, simplemente cambie de perfil o use -P flag desde la línea de comando.

UPD : ¿qué hacer si algunas propiedades son las mismas para las configuraciones? Haga la configuración de esta manera:

   local  true     src/main/resources   src/main/config/local      dev    src/main/resources   src/main/config/dev      

La parte común se almacenará en src/main/resources y otras configuraciones estarán en las carpetas apropiadas en el directorio config.

Si desea eliminar ant de su proceso, consideraría usar perfiles de comstackción con filtros.

En este escenario, conecte sus archivos de propiedades a la estructura del árbol src / main / resources. A continuación, parametrice el archivo de propiedades con propiedades de filtro como esta:

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

Luego dentro de src / main / filters crea archivos de filtro basados ​​en perfiles. entonces podrías tener dev-filters.properties sit-filters.properties, etc. Estos contienen:

 filtered.jdbc.property=jdbc url here 

Luego configura los perfiles de comstackción para cada región donde establece una propiedad env apunta a la región particular de su edificio. Luego puede configurar el filtro de recursos para usar ${env}-filters.properties para cada comstackción. Además, puede configurar el plugin war para agregar la propiedad env a su artefacto, de modo que realmente almacene 4 artefactos diferentes en su repository bajo un clasificador diferente.

Luego, simplemente crea la aplicación con cada perfil. Tienes que llamar a la comstackción para cada perfil, pero funciona bien.

Ejemplo de algunas configuraciones en el POM:

   src/main/filters/filter-${env}-application.properties    src/main/resources true     maven-war-plugin 2.1-beta-1   package  war   ${env}         LOCAL  true   LOCAL    DEV  DEV    UAT  UAT    PROD  PROD    

Además, apoyos a esta entrada de blog que es donde originalmente encontré los pasos para lograr esto.

He manejado esto usando Spring’s PropertyPlaceholderConfigurer e incluyendo archivos de propiedades en classpath y uno en el filesystem:

  

Si hay un archivo myapp * .properties en el directorio actual cuando se inicia la aplicación (o se ejecutan pruebas, etc.), se anularán las propiedades de los archivos incluidos en war / ear / whatever.

Hay un artículo sobre esto en maven 2 usando perfiles de comstackción . Parece que simplemente delega a la ant de todos modos a través del plugin antrun, por lo que incluso podrías salirte con la suya al volver a utilizar tus archivos build.xml existentes.

Esto lo deletrea bastante bien, usa los perfiles de construcción como @seth mencionó-

http://maven.apache.org/guides/mini/guide-building-for-different-environments.html