--- title: Environment --- # Trabalhando com diferentes ambientes Environment é uma funcionalidade do VRaptor que permite que você pode definir componentes diferentes conforme o ambiente que você está: produção, testes, desenvolvimento, etc. ## Configuração Em seu `web.xml`, adicione: ~~~ #!xml br.com.caelum.vraptor.environment nome_do_ambiente ~~~ Onde `nome_do_ambiente` é o ambiente atual (`PRODUCTION` ou `DEVELOPMENT`, por exemplo). Ou se preferir, você também pode criar uma variável de ambiente conforme seu sistema operacional, chamada `VRAPTOR_ENV`. Exemplo no windows: ~~~ set VRAPTOR_ENV=PRODUCTION ~~~ Exemplo no unix: ~~~ export VRAPTOR_ENV=PRODUCTION ~~~ ## Definindo as propriedades de um ambiente O arquivo `nome_do_ambiente.properties` deve ser criado em `src/main/resources`. Exemplo de um arquivo `development.properties`: ~~~ #!properties ambiente_de_teste = true email_de_teste = test.mail@mail.com environment.controller = true ~~~ ## Acessando propriedades de ambiente no seu código ~~~ #!java @Controller public class MeuController { private final Environment environment; private final MailSender sender; /** * @deprecated CDI eyes only */ protected MeuController(){ this(null, null); } @Inject public MeuController(Environment environment, MailSender sender) { this.environment = environment; this.sender = sender; } public void sendMail(String email) { if(environment.isDevelopment()) { sender.sendMailTo(environment.get("email_de_teste")); return; } sender.sendMailTo(email); } } ~~~ ## Acessando propriedades de ambiente no JSP ~~~ #!xml

Você está no ambiente de teste. Suas ações aqui não afetarão o sistema.

Enviando e-mail para: ${environment.get('email_de_teste')} ~~~ ## Acessando arquivos de configuração de acordo com o environment Se você precisa acessar um arquivo de configuração diferente para suas bibliotecas, de acordo com seu ambiente, você também pode utilizar o Environemnt. Basta colocar, por exemplo, seu `hibernate.cfg.xml` em diretórios com o nome de seus ambientes: *development* e *production* (por exemplo). `Environment.getResource(...)` retornará o resource de acordo com seu ambiente atual: ~~~ #!java cfg = new AnnotationConfiguration(); cfg.configure(environment.getResource("/hibernate.cfg.xml")); ~~~ Para manter compatibilidade com quem não utilizava o environment, caso o arquivo não seja encontrado no diretório com o nome do ambiente, ele será carregado no diretório root (do classpath). ## Injetando o valor de suas configuração programaticamente Você também consegue injetar suas configurações programaticamente usando o `@Property`, por exemplo: ~~~ #!java @Controller public class MeuController { @Inject @Property("email") private String email; public void sendMail(String email) { sender.sendMailTo(email); } } ~~~ Neste caso, se o seu environment estiver com valor `DEVELOPMENT`, vai injetar o valor que corresponde a chave *email* do arquivo `development.properties`, se estiver com `PRODUCTION` do `production.properties` e assim por diante. Dessa forma você não precisa dos ifs como: `if(environment.isDevelopment()) {...}` em seu código. Outra facilidade, é que se o nome da chave for o mesmo nome do field injetado, como em nosso caso com a chave *email*, você pode deixar apenas o `@Property` que o nome será inferido. Seu controller ficaria assim: ~~~ #!java @Controller public class MeuController { @Inject @Property private String email; public void sendMail(String email) { sender.sendMailTo(email); } } ~~~ Você também pode definir um valor default para essa propriedade: ~~~ #!java @Inject @Property(defaultValue = "config.properties") private String fileName; ~~~