Skillnader mellan war och jar-filer

Faktum är att ett jar-bibliotek bara är ett zip-arkiv, vilket direkt följer av dess namn: Java Archive . Oftast innehåller den bara fyra saker:

  • sammanställda klasser;
  • resurser: egenskapsfiler och liknande;
  • manifest MANIFEST.MF;
  • andra jarbibliotek (sällsynt).

Den typiska strukturen för ett sådant arkiv ser ut så här:

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

Låt oss nu titta på en typisk krigsfil. Förresten, krig är inte från ordet krig, utan från W eb Ar chive . Strukturen för en krigsfil är vanligtvis mer komplex. Oftast består den av två delar:

  • Java del
    • sammanställda klasser
    • resurser för java-klasser: egenskapsfiler och liknande
    • andra jarbibliotek (ofta)
    • manifest MANIFEST.MF
  • webbdel
    • web-xml - deskriptor för webbtjänstdistribution
    • jsp-servlets
    • statiska webbresurser: HTML, CSS, JS-filer

Ett exempel 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 köras av bara en java-maskin, men för att köra en war-fil måste den laddas upp till en webbserver. Den startar inte av sig själv.

war fil plugin med maven-war-plugin

Låt oss föreställa oss att vi har ett enkelt webbprojekt. Låt projektet få en sådan filstruktur, hur sätter vi ihop det?

|-- 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åste vi berätta för Maven att bygga allt detta som en krigsfil , det finns en <package> -tagg för detta , till exempel:

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

För det andra måste vi inkludera plugin-programmet maven-war-plugin . Exempel:

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

Här definierar vi helt enkelt en plugin som kan konfigureras i framtiden. Med hjälp av taggen webappDirectory omdefinierar vi också katalogen som projektet kommer att distribueras till. Nu ska jag berätta mer om vad jag pratar om.

Insticksprogrammet kan ställas in på två bygglägen (två typer av mål):

  • krig: krig
  • krig:exploderade

I det första fallet placeras den resulterande war-filen helt enkelt i målmappen och heter <artifactId>-<version>.war .

Men du kan "fråga" plugin-programmet så att innehållet i krigsfilen placeras i den sista mappen i det tillstånd där det kommer att packas upp av webbservern inuti. För detta används goal war:exploded .

Den andra metoden används ofta om du kör eller felsöker ett projekt direkt från Intellij IDEA.

WebappDirectory- taggen i exemplet ovan låter dig förresten omdefiniera katalogen där din krigsfil kommer att packas upp när du bygger i krig:exploderat läge.

Du kan lära dig om andra plugin-inställningar från dess officiella sida .

Bygga en webbapplikation baserad på SpringBoot

Tja, jag skulle vilja ta isär något riktigt monteringsexempel. Låt oss inte vara småsaker och överväga detta med hjälp av en exempelapplikation baserad på SpringBoot.

Steg ett. Skapa ett tomt Maven-webbprojekt med IDEA.

Steg två. Lägg till Spring-beroenden till dess 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>

Steg tre. Skapa en klass com.codegym.spring.MainController . Den måste placeras i mappen src/main/java :

@Controller
public class MainController {

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

Det finns 3 saker som beskrivs här. Först berättar @Controller-anteckningen för SpringBoot-ramverket att den här klassen kommer att användas för att betjäna inkommande webbförfrågningar.

För det andra indikerar @GetMapping-kommentaren att vår metod kommer att anropas för att betjäna en GET-begäran på rot-URI-/

För det tredje returnerar metoden strängen "index" . Detta talar om för SpringBoot-ramverket att returnera innehållet i filen index.html som ett svar .

Steg fyra. Du måste lägga till en index.html-fil till projektet med följande innehåll:

<!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 är inte bara html. Innan dess innehåll ges till klienten kommer det att modifieras på servern av Thymeleaf -ramverket . Särskilda taggar är inbäddade i den här filen, som gör att Thymeleaf-biblioteket kan bearbeta och ändra innehållet på sidan.

Taggarna i rött är taggarna som kommer att behandlas av Thymeleaf-biblioteket, de gröna är stilarna i Bootstrap CSS-biblioteket.

Steg fem. Ställ in plugin-programmet i pom.xml:

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

Jag överskattade min styrka lite. Det tar mycket tid att helt analysera ett enkelt exempel. Men du kan ladda ner hela koden för projektet från GitHub och försöka förstå det själv. Förresten, 80% av din arbetstid kommer du att göra just det :)

Du kan ladda ner hela koden från länken i GitHub .