1. Introdução do caso:
1.1 Estrutura:
1.2 pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
.....................................................
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
1.3 Código da camada do controlador:
@RestController
public class TestController {
@GetMapping(value = "/")
public String test1() {
return "hello world";
}
@GetMapping(value = "/test")
public Map<String, Object> test() {
Map<String, Object> map = new HashMap<>();
map.put("张三", 1);
map.put("李四", 2);
return map;
}
}
1.4 Classe de inicialização do boot do Spring
@SpringBootApplication
public class DebugDemoApplication{
public static void main(String[] args) {
SpringApplication.run(DebugDemoApplication.class, args);
}
}
1.5 Breve descrição
Qualquer configuração em application.yaml.
Demonstração de inicialização de primavera muito simples. Comece diretamente com a execução local. Completamente ok.
E o navegador visita localhost: 8080 ( aqui server.servlet. O caminho do contexto não está configurado no application.yaml ), que pode ser visto no navegador
2. O problema
Esta demonstração simples usa a ideia local e é executada para iniciar.Não há problema algum, mas é empacotada em um pacote war usando o maven e, em seguida, começou a usar o tomcat e, em seguida, visita localhost: 8080 / nome do projeto (ps: aqui é construído com o springboot tomcat é executado, o caminho de acesso não é o mesmo) .
Depois de usar o maven para concluir o pacote: demo-0.0.1-SNAPSHOT.war, renomeie-o para demo.war e solte-o no tomcat webapps. Execute .status.bat no diretório bin para executar o tomcat.
Visite o navegador localhost: 8080 / demo:
3. Resolver
3.1 Introdução ao spring-boot-starter-tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
3.2 Classe de inicialização
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class DebugDemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DebugDemoApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DebugDemoApplication.class);
}
}
Após a conclusão da modificação acima, use a idéia para executar novamente para iniciar, visite o navegador localhost: 8080:
Empacote novamente, renomeie e inicie o servidor tomcat para ver o efeito colocado no servidor tomcat externo:
Portanto, em resumo, o problema foi resolvido.
ps:
O caminho da interface entre a inicialização local do springboot e o acesso à inicialização do servidor tomcat não é o mesmo. A solução aqui também é muito simples. Adicione uma configuração ao arquivo de configuração principal application.yml do spring boot:
server:
servlet:
context-path: /demo #项目名