Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan masalah yang dihadapi apabila projek SpringBoot dibungkus dan dikeluarkan kepada tomcat luaran

Bagaimana untuk menyelesaikan masalah yang dihadapi apabila projek SpringBoot dibungkus dan dikeluarkan kepada tomcat luaran

WBOY
WBOYke hadapan
2023-05-10 17:49:141012semak imbas

Mari kita bincangkan tentang situasi apabila kita menghadapi masalah:

Saya cuba menggunakan rangka kerja but spring untuk menulis projek web kecil buat kali pertama, dan ia boleh bermula dan berjalan seperti biasa dalam Intellij IDEA. Gunakan maven untuk menjalankan pemasangan, menjana pakej perang, dan menerbitkannya kepada tomcat tempatan Pengecualian berlaku. Maklumat pengecualian utama ialah .....LifeCycleException. Selepas pelbagai pencarian, saya temui jawapannya.

Oleh kerana spring boot mempunyai bekas tomcat terbenam, projek itu boleh diterbitkan dengan membungkusnya sebagai pakej jar Tetapi bagaimana untuk membungkus projek spring boot menjadi projek pakej perang yang boleh diterbitkan kepada tomcat?

1. Memandangkan anda perlu membungkusnya ke dalam projek pakej perang, anda perlu mengubah suai jenis pembungkusan dalam pom

2 dibenamkan dalam projek web but musim bunga, jadi jika kita ingin menerbitkan pakej perang ke projek tomcat, kita perlu mengecualikan kebergantungan pakej tomcat yang dibenamkan dalam but musim bunga kod di bawah.

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

Satu perkara yang saya ingin katakan ialah jika anda masih mahu menggunakan spring boot embedded tomcat untuk penyahpepijatan semasa membangunkan secara tempatan, cuma tambahkan dependensi berikut

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

3 Titik masuk program web pakej ialah kelas di mana fungsi utama terletak, yang diberi penjelasan dengan @SpringBootApplication. Walau bagaimanapun, jika pakej perang diterbitkan kepada tomcat, anda perlu menambah subkelas SpringBootServletInitializer dan mengatasi kaedah konfigurasinya, atau mewarisi secara langsung kelas di mana fungsi utama terletak daripada subkelas SpringBootServletInitializer dan mengatasi kaedah konfigurasinya. Contoh kod adalah seperti berikut,

@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);
  }
}

Di atas melengkapkan semua langkah untuk membungkus pakej perang projek but spring, dan boleh diterbitkan kepada tomcat7 dan ke atas.

Akhir sekali dan yang paling penting, jika versi tomcat tempatan anda tidak konsisten dengan versi 8.0 disepadukan secara automatik oleh springboot. Terdapat juga masalah, penyelesaiannya:

Versi Tomcat tempatan saya ialah 8.0.28, dan Tomcat pada pelayan ialah 7.0.69. Saya menggunakan Tomcat 7.0.70 secara tempatan dan melaporkan ralat yang sama. Saya lebih pasti bahawa masalah itu berkaitan dengan versi Tomcat. Selepas mencari maklumat dalam pelbagai cara, akhirnya saya melihat seorang warga asing di Stackoverflow yang mengatakan bahawa bekas Servlet lalai SpringBoot adalah berdasarkan Tomcat8

Saya telah menemui pakej balang berkaitan Tomcat dalam pakej perang yang disediakan, dan ia adalah daripada Tomcat8. Ambil Tomcat8 Pakej benam tidak boleh digunakan di bawah Tomcat7

Bagaimana untuk menyelesaikan masalah yang dihadapi apabila projek SpringBoot dibungkus dan dikeluarkan kepada tomcat luaran

Untuk menyokong versi Tomcat yang lebih rendah, anda perlu menentukan versi Tomat dalam maven seperti berikut:

<properties>
  <tomcat.version>7.0.69</tomcat.version>
</properties>

Kemudian tambahkannya pada kebergantungan (ini sebenarnya tidak perlu, dokumen rasmi menambahnya)

<dependency>
  <groupid>org.apache.tomcat</groupid>
  <artifactid>tomcat-juli</artifactid>
  <version>${tomcat.version}</version>
</dependency>

Selepas menambahnya, saya mencubanya, dan ternyata tiada masalah. Selepas melihat direktori lib dalam pakej perang, ia memang menjadi pakej Tomcat7

Bagaimana untuk menyelesaikan masalah yang dihadapi apabila projek SpringBoot dibungkus dan dikeluarkan kepada tomcat luaran

Tetapi saya masih keliru sedikit versi Tomcat jika konfigurasi dibungkus seperti ini? Memandangkan had ini disebabkan oleh bekas Servlet di dalam SpringBoot, bolehkah saya tidak menggunakannya? Selepas menyemak banyak maklumat, saya menemui penyelesaian!

rreeee

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah yang dihadapi apabila projek SpringBoot dibungkus dan dikeluarkan kepada tomcat luaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam