Implantar um WAR de inicialização Spring em um servidor Tomcat
1. Introdução
Spring Boot é uma estruturaconvention over configuration que nos permite definir uma configuração pronta para produção de um projeto Spring, eTomcat é um dos mais populares Java Servlet Containers.
Por padrão, Spring Boot cria um aplicativo Java autônomo que pode ser executado como um aplicativo de desktop ou ser configurado como um serviço do sistema, mas há ambientes onde não podemos instalar um novo serviço ou executar o aplicativo manualmente.
Ao contrário dos aplicativos independentes, o Tomcat é instalado como um serviço que pode gerenciar vários aplicativos no mesmo processo, evitando a necessidade de uma configuração específica para cada aplicativo.
Neste guia, vamos criar um aplicativo Spring Boot simples e adaptá-lo para funcionar no Tomcat.
2. Configurando um aplicativo de inicialização Spring
Vamos configurar um aplicativo da web Spring Boot simples usando um dos modelos iniciais disponíveis:
org.springframework.boot
spring-boot-starter-parent
2.0.2.RELEASE
org.springframework.boot
spring-boot-starter-web
There’s no need for additional configurations além do@SpringBootApplication padrão, pois o Spring Boot cuida da configuração padrão.
Nós adicionamos um REST EndPoint simples para retornar algum conteúdo válido para nós:
@RestController
public class TomcatController {
@GetMapping("/hello")
public Collection sayHello() {
return IntStream.range(0, 10)
.mapToObj(i -> "Hello number " + i)
.collect(Collectors.toList());
}
}
Agora vamos executar o aplicativo commvn spring-boot:rune iniciar um navegador emhttp://localhost:8080/hello para verificar os resultados.
3. Criando um WAR de Inicialização Spring
Os contêineres de servlet esperam que os aplicativos cumpram alguns contratos a serem implantados. Para Tomcat, o contrato é oServlet API 3.0.
Para que nosso aplicativo cumpra este contrato, precisamos realizar algumas pequenas modificações no código-fonte.
Primeiro, precisamos empacotar um aplicativo WAR em vez de um JAR. Para isso, alteramospom.xml com o seguinte conteúdo:
war
Agora, vamos modificar o nome do arquivoWAR final para evitar a inclusão de números de versão:
${artifactId}
...
Então, vamos adicionar a dependência do Tomcat:
org.springframework.boot
spring-boot-starter-tomcat
provided
Finalmente, inicializamos o contexto Servlet exigido pelo Tomcat implementando a interfaceSpringBootServletInitializer:
@SpringBootApplication
public class SpringBootTomcatApplication extends SpringBootServletInitializer {
}
Para construir nosso aplicativo WAR implementável por Tomcat, executamosthe mvn clean package. Depois disso, nosso arquivo WAR é gerado emtarget/spring-boot-tomcat.war (assumindo que MavenartifactId é “spring-boot-tomcat”).
Devemos considerar que esta nova configuração torna nosso aplicativo Spring Boot um aplicativo não autônomo (se você gostaria de tê-lo funcionando em modo autônomo novamente, remova o escopoprovided da dependência do tomcat).
4. Implementando o WAR no Tomcat
Para que nosso arquivo WAR seja implantado e executado no Tomcat, precisamos concluir as seguintes etapas:
-
Download Apache Tomcate descompacte em uma pastatomcat
-
Copie nosso arquivo WAR detarget/spring-boot-tomcat.war para a pastatomcat/webapps/
-
De um terminal, navegue até a pastatomcat/bin e execute
-
catalina.bat run (no Windows)
-
catalina.sh run (em sistemas baseados em Unix)
-
Esta foi uma configuração rápida do Tomcat, verifique o guia emTomcat Installation para um guia de configuração completo. Existem também formas adicionais dedeploying a WAR file to Tomcat.
5. Conclusão
Neste breve guia, criamos um aplicativo Spring Boot simples e o transformamos em um aplicativo WAR válido implantável em um servidor Tomcat.
Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.