Forskjeller mellom krig og jar-filer

Faktisk er et jar-bibliotek bare et zip-arkiv, som følger direkte av navnet: Java Archive . Oftest inneholder den bare fire ting:

  • kompilerte klasser;
  • ressurser: egenskaper filer og lignende;
  • manifest MANIFEST.MF;
  • andre jar-biblioteker (sjelden).

Den typiske strukturen til et slikt arkiv ser slik ut:

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

La oss nå se på en typisk krigsfil. Krig er forresten ikke fra ordet krig, men fra W eb Ar chive . Strukturen til en krigsfil er vanligvis mer kompleks. Oftest består den av to deler:

  • Java del
    • kompilerte klasser
    • ressurser for java-klasser: egenskapsfiler og lignende
    • andre jar-biblioteker (ofte)
    • manifest MANIFEST.MF
  • webdel
    • web-xml - deskriptor for nettjenesteimplementering
    • jsp-servlets
    • statiske nettressurser: 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

Viktig! jar-filen kan kjøres av bare en java-maskin, men for å kjøre en krigsfil må den lastes opp til en webserver. Den starter ikke av seg selv.

war file plugin med maven-war-plugin

La oss forestille oss at vi har et enkelt nettprosjekt. La prosjektet få en slik filstruktur, hvordan setter vi det sammen?

|-- 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 må vi fortelle Maven å bygge alt dette som en krigsfil , det er en <pakke> -tag for 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 andre må vi inkludere maven-war-plugin plugin . 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 ganske enkelt en plugin som kan konfigureres i fremtiden. Ved å bruke webappDirectory- taggen redefinerer vi også katalogen som prosjektet skal distribueres til. Nå skal jeg fortelle deg mer om hva jeg snakker om.

Programtillegget kan settes til to byggemoduser (to typer mål):

  • krig: krig
  • krig: eksploderte

I det første tilfellet plasseres den resulterende krigsfilen ganske enkelt i målmappen og heter <artifactId>-<versjon>.war .

Men du kan "spør" plugin-en slik at innholdet i krigsfilen blir plassert i den siste mappen i tilstanden der den vil bli pakket ut av webserveren inne. Til dette brukes goal war:exploded .

Den andre tilnærmingen brukes ofte hvis du kjører eller feilsøker et prosjekt direkte fra Intellij IDEA.

Forresten, webappDirectory- taggen i eksemplet ovenfor lar deg omdefinere katalogen der krigsfilen din skal pakkes ut når du bygger i war:exploded-modus.

Du kan lære om andre plugin-innstillinger fra den offisielle siden .

Bygge en nettapplikasjon basert på SpringBoot

Vel, jeg vil gjerne demontere et ekte monteringseksempel. La oss ikke være bagateller og vurdere dette ved å bruke et eksempelprogram basert på SpringBoot.

Steg en. Lag et tomt Maven-nettprosjekt med IDEA.

Trinn to. Legg til Spring-avhengigheter til 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>

Trinn tre. Opprett en klasse com.codegym.spring.MainController . Den må plasseres i src/main/java -mappen :

@Controller
public class MainController {

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

Det er 3 ting beskrevet her. For det første forteller @Controller-kommentaren SpringBoot-rammeverket at denne klassen vil bli brukt til å betjene innkommende nettforespørsler.

For det andre indikerer @GetMapping-kommentaren at metoden vår vil bli kalt for å betjene en GET-forespørsel på rot-URI-en - /

For det tredje returnerer metoden strengen "indeks" . Dette forteller SpringBoot-rammeverket å returnere innholdet i index.html- filen som et svar .

Trinn fire. Du må legge til en index.html-fil til prosjektet med følgende innhold:

<!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 bare html. Før innholdet blir gitt til klienten, vil det bli modifisert på serveren av Thymeleaf -rammeverket . Spesielle tagger er innebygd i denne filen, som lar Thymeleaf-biblioteket behandle og endre innholdet på siden.

Taggene i rødt er taggene som vil bli behandlet av Thymeleaf-biblioteket, de grønne er stilene til Bootstrap CSS-biblioteket.

Trinn fem. Sett plugin-en i pom.xml:

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

Jeg overvurderte styrken min litt. Det tar mye tid å analysere et enkelt eksempel fullstendig. Men du kan laste ned hele koden til prosjektet fra GitHub og prøve å forstå det selv. Forresten, 80% av arbeidstiden din vil du gjøre nettopp det :)

Du kan laste ned hele koden fra lenken i GitHub .