Diferențele dintre fișierele război și jar

De fapt , o bibliotecă jar este doar o arhivă zip, care urmează direct de la numele său: Arhiva Java . Cel mai adesea conține doar patru lucruri:

  • clase compilate;
  • resurse: fișiere de proprietăți și altele asemenea;
  • manifest MANIFEST.MF;
  • alte biblioteci jar (rar).

Structura tipică a unei astfel de arhive arată astfel:

  META-INF/
  	MANIFEST.MF
  com/
  	codegym/
	      MyApplication.class
  application.properties

Acum să ne uităm la un fișier de război tipic. Apropo, război nu este din cuvântul război, ci din W eb Ar chive . Structura unui dosar de război este de obicei mai complexă. Cel mai adesea este format din două părți:

  • parte Java
    • clase compilate
    • resurse pentru clasele java: fișiere de proprietăți și altele asemenea
    • alte biblioteci jar (adesea)
    • manifest MANIFEST.MF
  • partea web
    • web-xml - descriptor de implementare a serviciului web
    • servlet-uri jsp
    • Resurse web statice: fișiere HTML, CSS, JS

Un exemplu de fișier de război tipic:

META-INF/
    MANIFEST.MF
WEB-INF/
    web.xml
    jsp/
    	helloWorld.jsp
    classes/
    	static/
    	templates/
    	application.properties
    lib/
    	// *.jar files as libs

Important! jar poate fi rulat doar de o mașină java, dar pentru a rula un fișier war, acesta trebuie să fie încărcat pe un server web. Nu începe de la sine.

plugin pentru fișierul război cu maven-war-plugin

Să ne imaginăm că avem un proiect web simplu. Lăsați proiectul să primească o astfel de structură de fișiere, cum îl asamblam?

|-- pom.xml
 `-- src
 	`-- main
     	|-- java
     	|   `-- com
     	|   	`-- example
     	|       	`-- projects
     	|           	`-- SampleAction.java
     	|-- resources
     	|   `-- images
     	|   	`-- sampleimage.jpg
     	`-- webapp
         	|-- WEB-INF
         	|   `-- web.xml
         	|-- index.jsp
         	`-- jsp
             	`-- websource.jsp

În primul rând, trebuie să îi spunem lui Maven să construiască toate acestea ca un fișier de război , există o etichetă <pachet> pentru aceasta , de exemplu:

	<project>
  	...
      <groupId>com.example.projects</groupId>
      <artifactId>simple-war</artifactId>
  	<packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
  	<name>Simple War Project</name>
      <url>http://codegym.cc</url>
  	...
    </project>

În al doilea rând, trebuie să includem pluginul maven-war-plugin . Exemplu:

  <build>
	<plugins>
  	<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
    	<version>3.3.2</version>
    	<configuration>
          <webappDirectory>/sample/servlet/container/deploy/directory</webappDirectory>
    	</configuration>
      </plugin>
    </plugins>
  </build>

Aici definim pur și simplu un plugin care poate fi configurat în viitor. De asemenea, folosind eticheta webappDirectory , redefinim directorul în care va fi implementat proiectul. Acum o să vă spun mai multe despre ce vorbesc.

Pluginul poate fi setat la două moduri de construire (două tipuri de obiective):

  • război: război
  • război: explodat

În primul caz, fișierul război rezultat este pur și simplu plasat în folderul țintă și numit <artifactId>-<version>.war .

Dar puteți „întreba” pluginul astfel încât conținutul fișierului război să fie plasat în folderul final în starea în care va fi despachetat de serverul web din interior. Pentru aceasta, se folosește goal war:exploded .

A doua abordare este adesea folosită dacă rulați sau depanați un proiect direct din Intellij IDEA.

Apropo, eticheta webappDirectory din exemplul de mai sus vă permite să redefiniți directorul în care fișierul dvs. război va fi dezambalat atunci când construiți în modul war:exploded.

Puteți afla despre alte setări de plugin de pe pagina sa oficială .

Construirea unei aplicații web bazată pe SpringBoot

Ei bine, aș dori să dezasamblam un exemplu real de asamblare. Să nu fim fleacuri și să luăm în considerare acest lucru folosind un exemplu de aplicație bazată pe SpringBoot.

Primul pas. Creați un proiect web Maven gol cu ​​IDEA.

Pasul doi. Adăugați dependențe Spring la pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

Pasul trei. Creați o clasă com.codegym.spring.MainController . Trebuie să fie plasat în folderul src/main/java :

@Controller
public class MainController {

	@GetMapping("/")
    public String viewIndexPage(Model model) {
        model.addAttribute("header", "Maven Generate War");
    	return "index";
	}
}

Sunt 3 lucruri descrise aici. În primul rând, adnotarea @Controller spune cadrului SpringBoot că această clasă va fi utilizată pentru a servi cererile web primite.

În al doilea rând, adnotarea @GetMapping indică faptul că metoda noastră va fi apelată pentru a servi o solicitare GET pe URI rădăcină - /

În al treilea rând, metoda returnează șirul „index” . Aceasta îi spune cadrului SpringBoot să returneze conținutul fișierului index.html ca răspuns .

Pasul patru. Trebuie să adăugați un fișier index.html la proiect cu următorul conținut:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
    <!-- Bootstrap core CSS -->
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
    <nav class="navbar navbar-light bg-light">
    	<div class="container-fluid">
        	<a class="navbar-brand" href="#">
            	CodeGym Tutorial
        	</a>
    	</div>
    </nav>
    <div class="container">
    	<h1>[[${header}]]</h1>
    </div>
</body>
</html>

Nu este doar html. Înainte ca conținutul său să fie dat clientului, acesta va fi modificat pe server de cadrul Thymeleaf . În acest fișier sunt încorporate etichete speciale, care permit bibliotecii Thymeleaf să proceseze și să modifice conținutul paginii.

Etichetele cu roșu sunt etichetele care vor fi procesate de biblioteca Thymeleaf, cele verzi sunt stilurile bibliotecii CSS Bootstrap.

Pasul cinci. Setați pluginul în pom.xml:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.1</version>
</plugin>

Mi-am supraestimat putin puterea. Este nevoie de mult timp pentru a analiza complet un exemplu simplu. Dar puteți descărca codul complet al proiectului de pe GitHub și încercați să îl înțelegeți singur. Apropo, 80% din timpul tău de lucru vei face exact asta :)

Puteți descărca codul complet din linkul din GitHub .