Mostrando entradas con la etiqueta properties. Mostrar todas las entradas
Mostrando entradas con la etiqueta properties. Mostrar todas las entradas

martes, 28 de julio de 2015

Maven, los perfiles y los ficheros de propiedades

Hola buenas, en este post vamos a hablar un poco sobre como funciona Maven y los perfiles, principalmente enfocado a los ficheros de propiedades y la activación por defecto. Se suele dar en ciertos proyectos en los cuales hay diferentes ficheros de propiedades según el entorno donde se necesite desplegar la aplicación. Para evitar esto, que no deja de ser una fuente de errores, estan los perfiles. En maven podemos crear diferentes perfiles que nos permitan indicar determinadas propiedades en función del entorno donde se vaya a desplegar. De la siguiente forma:
       
  global
  defaultValue
 

 
  
   local
   
    true
   
   
    true
    localProfile
   
  
  
   pro
   
    false
    proProfile
   
  
 
Como podéis ver, hemos indicado que un perfil (en este caso el local) sea activado siempre por defecto. Esto quiere decir que si no indicamos ningún valor concreto, los ficheros de propiedades tendrán el valor de las propiedades de ese perfil. También podéis ver como hay dos tipos de propiedades. Las que estan definidas de forma global (como puede ser 'property.global') y las que estan definidas para cada perfile (como 'mvn.app.debug.mode'). Hay que tener en cuenta, que si en un determinado perfil, indicamos el valor de una propiedad global, sobreescribiremos este mismo. Ahora tenemos el siguiente código de prueba:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "file:src/test/resources/conf/mvc-dispatcher-servlet-test.xml")
public class ConstantsUtilTest {
 private final Logger LOGGER = Logger.getLogger(ConstantsUtilTest.class);
 @Autowired
 private ConstansUtil utility;
 @Test
 public void getProperties() {
  try {
   String propertyGlobal = utility.getPropertyGlobal();
   String propertyProfile = utility.getPropertyProfile();
   if(propertyGlobal == null){
    Assert.fail();
   }else{
    LOGGER.info("propertyGlobal: "+propertyGlobal);
    LOGGER.info("propertyProfile: "+propertyProfile);
    Assert.assertTrue(true);
   }
  } catch (final Exception except) {
   LOGGER.error("Error: ", except);
   Assert.assertTrue(false);
  }
 }
Si no indicamos ningún perfil y ejecutamos el código, nos devolverá el siguiente valor.
25 jul 2015 00:00:00,000  INFO [es.home.test.properties.ConstantsUtilTest:  30] propertyGlobal: global
25 jul 2015 00:00:00,000  INFO [es.home.test.properties.ConstantsUtilTest:  31] propertyProfile: localProfile
Si por lo contrarío lo compilamos y ejecutamos con un perfil concreto, nos indicará la siguiente salida. (Para este caso concreto hemos utilizado el comando: mvn test -P pro).
25 jul 2015 00:00:00,000  INFO [es.discoteca.test.properties.ConstantsUtilTest:  30] propertyGlobal: global
25 jul 2015 00:00:00,000  INFO [es.discoteca.test.properties.ConstantsUtilTest:  31] propertyProfile: proProfile

Spring y el manejo de fichero properties

Buenas, en este caso vamos a explicar como se realiza el manejo de ficheros properties con Spring. Y posteriormente vamos a explicar como utilizar dichas propiedades en ficheros Java y ficheros de presentación. Para empezar debemos configurar el/los ficheros de propiedades. Esto lo podemos hacer a través de 'util:properties' que nos permite indicar uno o más ficheros de propiedades y a través de 'context:property-placeholder' asociamos esas mismas propiedades al contexto, lo que luego nos facilitará su obtención y utilización.


 
 
 
 
Para utilizarlos en un fichero de presentación (jsp, xhtml, etc) debemos hacer uso de el taglib de spring 'spring:eval'. A través del identificador indicado en el fichero de configuración 'propertyConfigurator' podremos acceder a las diferentes variables configuradas en los ficheros properties (en este caso 'app.name').
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

Por último para utilizarlo en fichero java, podemos crear una clase al estilo de la típica clase de constantes, pero obteniendo el valor directamente del fichero de propiedades. Esta clase la inyectaremos en las otras clases y cuando accedamos a sus atributos, tendremos el valor del fichero de propiedades.
@Component
public class ConstansUtil {
 @Value("${app.debug.mode}") 
        private String appDebugMode;
 public String getAppDebugMode() {
  return appDebugMode;
 }
 public void setAppDebugMode(String appDebugMode) {
  this.appDebugMode = appDebugMode;
 } 
}
En este caso como ya hemos configurado anteriormente los ficheros de propiedades a través del XML, nos funcionará. Pero también podemos configurar directamente en la clase que ficheros de propiedades se van a usar. De esta forma:
@Configuration
@PropertySource("classpath:application.properties")
public class ConstansUtil {
   @Bean
   public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
      return new PropertySourcesPlaceholderConfigurer();
   }
}