Zašto Spring Boot ne zahteva posebnu instalaciju Tomcat-a?
Zašto Spring Boot ne zahteva posebnu instalaciju Tomcat-a?
Prilikom prvog susreta sa Spring Boot-om, većina drugara verovatno je, kao i ja, bila radoznala:
Zašto Spring Boot ne zahteva posebnu instalaciju Tomcat-a?
Zašto zapravo? Krenimo sa znatiželjom na današnje putovanje.
Otvorimo projekat tobebetterjavaer koji smo podigli u prethodnom odeljku, pronađimo fajl pom.xml; u njemu se može videti svojstvo parent, čiji kod glasi ovako:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>Šta to znači?
Znači da naš trenutni Spring Boot projekat zavisi od ovog roditeljskog projekta spring-boot-starter-parent. Pomalo podseća na Java nasleđivanje (extends).
Kako da vidimo sadržaj fajla spring-boot-starter-parent.pom?
Ako nisi siguran gde ti je lokalni Maven repozitorijum, u terminalu izvrši komandu mvn help:effective-settings.

Prateći taj trag, prema groupId, artifactId i version roditelja možemo locirati fajl spring-boot-starter-parent.pom.

Kada ga otvorimo u tekst editoru, grubo možemo videti sledeći sadržaj:

- Definiše verziju JDK-a na 1.8
- Podrazumevani način kodiranja projekta je UTF-8
- Maven okruženje za kompajliranje
- Te roditeljsku zavisnost spring-boot-dependencies
Po istom obrascu, na isti način pronađimo fajl spring-boot-dependencies.pom. Vidimo da on definiše niz svojstava i zavisnosti - ukupno oko 2800 linija.

Ima zavisnosti za message queue, commons alatke, konekciju na bazu, HTTP konekciju, Spring porodicu, web server i sl.
Može se reći da je ovo centar za upravljanje verzijama zavisnosti Spring Boot projekta.
Centar za upravljanje verzijama podrazumevano konfiguriše sve verzije osnovnog okruženja potrebnog projektu; te verzije se menjaju sa napredovanjem verzije Spring Boot-a, što znači da programeri više ne moraju da brinu o verzijama tih sitnih zavisnosti - prepuštaju to Spring Boot-u kao glavnom domaćinu.
Spring Boot će za nas izabrati najstabilniju novu verziju, što izražava dušu Spring Boot projekta: „konvencija iznad konfiguracije". Naravno, želiš li da konfigurišeš - može, ali nema potrebe; dovoljno je pratiti usvojene konvencije.
Da bismo ovo razumeli, nastavimo da čitamo fajl pom.xml - u njemu postoji zavisnost spring-boot-starter-web. Ovoga puta direktno pritisni taster Ctrl (na macOS-u Command) i klikni levim tasterom miša - skočićeš direktno na izvorni fajl spring-boot-starter-web.pom.

Deo izvornog koda je sledeći:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.13</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
<scope>compile</scope>
</dependency>spring-web pruža osnovnu HTTP integraciju, uključujući i neke zgodne servlet filtere, Spring HTTP pozive, kao i infrastrukturu i tehnike za integraciju sa ostalim web framework-ima (Hessian, Burlap).
spring-webmvc je implementacija Spring MVC-a. Pošto spring-webmvc zavisi od spring-web, njegovo uključivanje indirektno povlači i spring-web, pa spring-web ne mora eksplicitno da se dodaje.
Pogledajmo pom fajl spring-boot-starter-tomcat-a:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.6.1</version>
<name>spring-boot-starter-tomcat</name>
<dependencies>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.55</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.55</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>9.0.55</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>tomcat-annotations-api</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>Odatle se vidi da je podrazumevani kontejner koji SpringBoot pokreće upravo Tomcat - jezgro Tomcat-a: jakarta.annotation, tomcat-embed-core, tomcat-annotations-api i org.apache.tomcat.embed, sve je uvedeno putem Maven-a.

Verzija core-a je 9.0.55, dok je najnovija 9.0.x verzija Tomcat-a na zvaničnom sajtu 9.0.56 - za jednu verziju viša.

Ali ne mora da znači - preuzmimo direktno src za 9.0.56 i uporedimo da li su grubo isti.

Uporedom se vidi da je Tomcat koji Spring Boot uvodi nešto „mršaviji", ali u suštini su isti - i to je osnovni razlog zašto Spring Boot ne zahteva posebnu instalaciju Tomcat-a.
Spring Boot starter je to već rešio za nas. To je i jedan od važnih razloga popularnosti Spring Boot-a - oslobađa programere vremena za konfiguraciju i omogućava im da se više posvete realizaciji poslovne logike i optimizaciji performansi; štaviše, sve ono komplikovano konfigurisanje prepušta se Spring Boot-u kao glavnom domaćinu - ono što je on ugovorio, ako nema problema i ako ne zahteva specijalnu prilagodbu, samo sledi i koristi.
