Maison  >  Article  >  Java  >  Comment résoudre les problèmes rencontrés lorsque le projet SpringBoot est empaqueté et publié sur Tomcat externe

Comment résoudre les problèmes rencontrés lorsque le projet SpringBoot est empaqueté et publié sur Tomcat externe

WBOY
WBOYavant
2023-05-10 17:49:141074parcourir

Parlons d'abord de la situation dans laquelle nous avons rencontré des problèmes :

J'ai essayé d'utiliser le framework Spring Boot pour écrire un petit projet Web pour la première fois, et il a pu démarrer et s'exécuter normalement dans IDÉE Intellij. Utilisez maven pour exécuter l'installation, générer le package war et le publier sur le tomcat local. Les principales informations sur l'exception sont .....LifeCycleException. Après diverses recherches, j'ai trouvé la réponse.

Parce que Spring Boot a un conteneur Tomcat intégré, le projet peut être publié en le conditionnant sous forme de package jar. Mais comment empaqueter le projet Spring Boot dans un projet de package war qui peut être publié sur Tomcat ?

1. Puisque vous devez l'empaqueter dans un projet de package war, vous devez d'abord modifier le type d'empaquetage dans le fichier pom.xml et changer la valeur par défaut du Spring Boot jarpackaging> vers war

2 Deuxièmement, le serveur Tomcat est intégré au projet Web Spring Boot, donc si nous voulons publier le package war sur Tomcat. projet, nous devons parler du tomcat intégré au Spring Boot. Excluez les dépendances du package, sinon des conflits se produiront, ouvrez simplement les commentaires dans le code ci-dessous.

<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>

Une chose que je veux dire est que si vous souhaitez toujours utiliser Tomcat intégré au Spring Boot pour le débogage lors du développement local, ajoutez simplement les dépendances suivantes :

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-tomcat</artifactid>
  <scope>provided</scope>
</dependency>

3. Le point d'entrée de Spring Boot pour publier le programme Web du package jar est la classe où se trouve la fonction principale, qui est annotée avec @SpringBootApplication. Cependant, si le package war est publié sur Tomcat, vous devez ajouter une sous-classe SpringBootServletInitializer et remplacer sa méthode configure, ou hériter directement de la classe où se trouve la fonction principale de la sous-classe SpringBootServletInitializer et remplacer sa méthode configure. L'exemple de code est le suivant,

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
   
  @Override
  protected SpringApplicationBuilder configure(
      SpringApplicationBuilder application) {
    return application.sources(DemoApplication.class);
  }
 
   
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

Ce qui précède complète toutes les étapes d'empaquetage du package war du projet Spring Boot, qui peut être publié sur Tomcat7 et supérieur.

Le dernier et le plus important point est que si votre version locale de Tomcat est incohérente avec la version 8.0 automatiquement intégrée par springboot. Il y aura aussi des problèmes, la solution est :

Ma version locale de Tomcat est la 8.0.28, et la version de Tomcat sur le serveur est la 7.0.69. J'ai déployé Tomcat 7.0.70 localement et signalé la même erreur. Je suis plus certain que le problème est lié à la version Tomcat. Après avoir cherché des informations de plusieurs manières, j'ai finalement vu un étranger sur Stackoverflow qui a dit que le conteneur Servlet par défaut de SpringBoot est basé sur Tomcat8. Si vous utilisez le package embed de Tomcat8 sous Tomcat7, cela ne fonctionnera certainement pas.

Pour prendre en charge les versions inférieures de Tomcat, vous devez spécifier la version de Tomat dans maven La configuration est la suivante : Comment résoudre les problèmes rencontrés lorsque le projet SpringBoot est empaqueté et publié sur Tomcat externe

<properties>
  <tomcat.version>7.0.69</tomcat.version>
</properties>
Puis ajoutez. à la dépendance (c'est en fait bien sans l'ajouter, le document officiel l'ajoute)

<dependency>
  <groupid>org.apache.tomcat</groupid>
  <artifactid>tomcat-juli</artifactid>
  <version>${tomcat.version}</version>
</dependency>
Après l'avoir ajouté, je l'ai essayé et cela ne pose aucun problème. Après avoir regardé le répertoire lib dans le package war, il est effectivement devenu un package Tomcat7

Mais je suis encore un peu confus, comment puis-je packager. avec cette configuration ? Cela ne signifie-t-il pas que si vous changez la version de Tomcat, vous devez la reconditionner ? Étant donné que cette limitation est causée par le conteneur Servlet dans SpringBoot, ne puis-je pas l'utiliser ? Après avoir vérifié de nombreuses informations, j'ai trouvé une solution ! Comment résoudre les problèmes rencontrés lorsque le projet SpringBoot est empaqueté et publié sur Tomcat externe


<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-tomcat</artifactid>
  <scope>provided</scope>
</dependency>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer