domingo, 3 de abril de 2016

Usando o Spring Boot no Wildfly 8.1.0

         Nesse post eu vou falar sobre rodar o Spring Boot no Wildfly. Bom, como o wildfly é um container de aplicações JavaEE completo, espera-se que não seja nenhum problema rodar o Spring Boot, certo? Pois é, mas algumas configurações são válidas para melhorar isso, que devem ser feitas no pom.xml.

         O Spring Boot carrega um Tomcat incorporado através da seguinte configuração no pom.xml:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
</dependency>

         Esta dependência não é necessária pois o Wildfly tem um Toncat Servidor Web chamado Undertow rodando em suas entranhas (O Tomcat era usado nas versões antigas quando era chamado JBoss). Comente esta dependência e no lugar dela deve ficar:

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <scope>provided</scope>
</dependency>

      Pelo que pesquisei, para garantir que não irá ser carregado o Toncat, é bom alterar também a seguinte dependência:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

         Deixando da seguinte forma:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
            <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-tomcat</artifactId>
                  </exclusion>
            </exclusions>
</dependency>

Outra coisa importante é garantir que o Mavem vai exportar um arquivo do tipo war:

<packaging>war</packaging>

Basicamente, com essas configurações o projeto que usa Spring Boot vai rodar muito bem no Wildfly, porém deixará de funcionar no modo que usava o Tomcat embutido, e a aplicação terá que ser sempre iniciada através do Wildfly, por isso indiquei que comentasse a configuração antiga, assim pode revezar a configuração quando necessário, comentando as configurações referentes ao wildfly e retirando o comentário a respeito do Tomcat.

Outra dica importante é que a URI quando usamos o Tomcat embutido não necessita do nome da aplicação, bastando digitar apenas o endereço local, a porta e o caminho definido no controller através da annotetion @RequestMapping, por exemplo:

http://localhost:8080/carros/novo  //tomcat embutido

Já com a aplicação no wildfly será necessário acrescentar o nome da aplicação ficando:

http://localhost:8080/loccar/carros/novo  //wildfly


E acrescentar a seguinte configuração no arquivo application.properties:

server.context-path=/loccar   //loccar é o nome da minha aplicação, subtitua pelo nome dado ao pacote war da sua aplicação.

       Se você usava o Tomcat embutido, terá que fazer várias alterações nos links de páginas, imagens, arquivos CSS, arquivos JavaScript, etc... Para isso não ser uma grande dor de cabeça, recomenda-se o uso do Thymeleaf (http://www.thymeleaf.org/) nos projetos, pois ele oferece meios de mapear de forma automática estes recursos.

Veja o link de um post sobre o Thymeleaf usado para este fim AQUI!

       Espero ter ajudado, qualquer dúvida, deixa nos comentários que eu tento da uma força...


Links úteis:

9 comentários:

  1. Só um feedback. O Wildfly não tem o Tomcat como container, e sim o Undertow. Nas versões antigas, quando ainda se chamava jBoss, tinha o Tomcat como container. http://wildfly.org/about/

    ResponderExcluir
    Respostas
    1. Verdade Adelmo, eles trocaram o container. Obrigado pela dica... vou corrigir no post ;)

      Excluir
  2. Boa noite, na classe Main é necessário fazer a extensão de SpringBootServletInitializer?

    ResponderExcluir
    Respostas
    1. Sim, isso que possibilita o spring ser inicializado e funcionar em um containner...

      Esse endereço traz uma explicação sobre isso : https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/support/SpringBootServletInitializer.html

      Que diz: SpringBootServletInitializer é um WebApplicationInitializer para executar SpringApplication a partir de uma implantação WAR tradicional. Vincula os beans Servlet, Filter e ServletContextInitializer do contexto do aplicativo para o recipiente de servlet.

      Para configurar o aplicativo, substitua o método configure (SpringApplicationBuilder) (chamando SpringApplicationBuilder.sources (Object ...)) ou crie o próprio inicializador uma anotação @Configuration. Se você estiver usando o SpringBootServletInitializer em combinação com outros WebApplicationInitializers, você também pode precisar adicionar uma anotação @Ordered para configurar uma ordem de inicialização específica.

      Observe que um WebApplicationInitializer só é necessário se você estiver construindo um arquivo war e implantando-o em um container. Se você preferir executar um container incorporado, então você não precisará disso.

      Excluir
  3. Este comentário foi removido por um administrador do blog.

    ResponderExcluir
  4. Eu tenho um arquivo de configurações .properties dentro do wildfly no caminho standalone\configuration\props. Tem alguma forma de conseguir pegar as configurações desse arquivo.

    ResponderExcluir
    Respostas
    1. Oi Fred, blz?

      Carrega o arquivo:

      InputStream in = new FileInputStream(diretorioDoArquivo + "nomeDoArquivo.properties");
      java.util.Properties configuracaoProperties = new Properties();
      configuracaoProperties.load(in);
      in.close();

      Depois usa:
      configuracaoProperties.getProperty("PalavraChave");

      Excluir