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 .