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...
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:
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/
ResponderExcluirVerdade Adelmo, eles trocaram o container. Obrigado pela dica... vou corrigir no post ;)
Excluire no jboss EAP? mesma coisa?
ResponderExcluirAcredito que sim, não tem porque não funcionar :)
ExcluirBoa noite, na classe Main é necessário fazer a extensão de SpringBootServletInitializer?
ResponderExcluirSim, isso que possibilita o spring ser inicializado e funcionar em um containner...
ExcluirEsse 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.
Este comentário foi removido por um administrador do blog.
ResponderExcluirEu 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.
ResponderExcluirOi Fred, blz?
ExcluirCarrega 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");