Forskelle mellem war og jar-filer

Faktisk er et jar-bibliotek kun et zip - arkiv, som direkte følger af dets navn: Java Archive . Oftest indeholder den kun fire ting:

  • kompilerede klasser;
  • ressourcer: egenskabsfiler og lignende;
  • manifest MANIFEST.MF;
  • andre jar-biblioteker (sjældent).

Den typiske struktur for et sådant arkiv ser således ud:

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

Lad os nu se på en typisk krigsfil. Krig er i øvrigt ikke fra ordet krig, men fra W eb Ar chive . Strukturen af ​​en krigsfil er normalt mere kompleks. Oftest består den af ​​to dele:

  • Java del
    • sammensatte klasser
    • ressourcer til java-klasser: egenskabsfiler og lignende
    • andre jar-biblioteker (ofte)
    • manifest MANIFEST.MF
  • webdel
    • web-xml - webtjenesteimplementeringsbeskrivelse
    • jsp servlets
    • statiske webressourcer: HTML, CSS, JS-filer

Et eksempel på en typisk krigsfil:

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

Vigtig! jar-fil kan køres af bare en java-maskine, men for at køre en war-fil skal den uploades til en webserver. Den starter ikke af sig selv.

war fil plugin med maven-war-plugin

Lad os forestille os, at vi har et simpelt webprojekt. Lad projektet få sådan en filstruktur, hvordan samler vi den?

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

Først skal vi bede Maven om at bygge alt dette som en krigsfil , der er et <pakke> -tag til dette , for eksempel:

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

For det andet skal vi inkludere maven-war-plugin-plugin'et . Eksempel:

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

Her definerer vi blot et plugin, der kan konfigureres i fremtiden. Ved at bruge webappDirectory- tagget omdefinerer vi også den mappe, som projektet vil blive implementeret i. Nu vil jeg fortælle dig mere om, hvad jeg taler om.

Pluginnet kan indstilles til to byggetilstande (to typer mål):

  • krig: krig
  • krig: eksploderede

I det første tilfælde placeres den resulterende krigsfil ganske enkelt i målmappen og hedder <artifactId>-<version>.war .

Men du kan "spørge" plugin'et, så indholdet af krigsfilen placeres i den sidste mappe i den tilstand, hvor den vil blive pakket ud af webserveren indeni. Til dette bruges goal war:exploded .

Den anden tilgang bruges ofte, hvis du kører eller fejlretter et projekt direkte fra Intellij IDEA.

I øvrigt giver webappDirectory- tagget i eksemplet ovenfor dig mulighed for at omdefinere den mappe, hvor din krigsfil skal pakkes ud, når du bygger i krig:eksploderede tilstand.

Du kan lære om andre plugin-indstillinger fra dens officielle side .

Opbygning af en webapplikation baseret på SpringBoot

Nå, jeg vil gerne skille et rigtigt monteringseksempel ad. Lad os ikke være bagateller og overveje dette ved at bruge en eksempelapplikation baseret på SpringBoot.

Trin et. Opret et tomt Maven-webprojekt med IDEA.

Trin to. Tilføj Spring-afhængigheder til dens 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>

Trin tre. Opret en klasse com.codegym.spring.MainController . Det skal placeres i mappen src/main/java :

@Controller
public class MainController {

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

Der er 3 ting beskrevet her. For det første fortæller @Controller-annotationen SpringBoot-rammen, at denne klasse vil blive brugt til at betjene indgående webanmodninger.

For det andet angiver @GetMapping-annotationen , at vores metode vil blive kaldt til at betjene en GET-anmodning på root-URI'en - /

For det tredje returnerer metoden strengen "indeks" . Dette fortæller SpringBoot frameworket at returnere indholdet af index.html filen som et svar .

Trin fire. Du skal tilføje en index.html-fil til projektet med følgende indhold:

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

Det er ikke kun html. Inden indholdet gives til klienten, vil det blive ændret på serveren af ​​Thymeleaf -rammeværket . Der er indlejret særlige tags i denne fil, som gør det muligt for Thymeleaf-biblioteket at behandle og ændre indholdet på siden.

De røde tags er de tags, der vil blive behandlet af Thymeleaf-biblioteket, de grønne er stilene i Bootstrap CSS-biblioteket.

Trin fem. Indstil plugin'et i pom.xml:

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

Jeg overvurderede min styrke lidt. Det tager meget tid at analysere et simpelt eksempel fuldt ud. Men du kan downloade den fulde kode for projektet fra GitHub og prøve at forstå det selv. Forresten, 80% af din arbejdstid vil du gøre netop det :)

Du kan downloade den fulde kode fra linket i GitHub .