Unterschiede zwischen War- und JAR-Dateien
Tatsächlich ist eine JAR-Bibliothek nur ein Zip - Archiv, was sich direkt aus dem Namen ableitet: Java- Archiv . Meistens enthält es nur vier Dinge:
- kompilierte Klassen;
- Ressourcen: Eigenschaftendateien und dergleichen;
- manifest MANIFEST.MF;
- andere JAR-Bibliotheken (selten).
Der typische Aufbau eines solchen Archivs sieht folgendermaßen aus:
META-INF/
MANIFEST.MF
com/
codegym/
MyApplication.class
application.properties
Schauen wir uns nun eine typische Kriegsdatei an. Der Begriff „ Krieg “ kommt übrigens nicht vom Wort „Krieg“, sondern vom Webarchiv . Der Aufbau einer Kriegsdatei ist in der Regel komplexer. Meistens besteht es aus zwei Teilen:
- Java-Teil
- kompilierte Klassen
- Ressourcen für Java-Klassen: Eigenschaftendateien und dergleichen
- andere JAR-Bibliotheken (oft)
- Manifest MANIFEST.MF
- Webpart
- web-xml – Webdienst-Bereitstellungsdeskriptor
- JSP-Servlets
- Statische Webressourcen: HTML-, CSS-, JS-Dateien
Ein Beispiel für eine typische Kriegsdatei:
META-INF/
MANIFEST.MF
WEB-INF/
web.xml
jsp/
helloWorld.jsp
classes/
static/
templates/
application.properties
lib/
// *.jar files as libs
Wichtig! Eine JAR-Datei kann nur von einer Java-Maschine ausgeführt werden. Um eine WAR-Datei auszuführen, muss sie jedoch auf einen Webserver hochgeladen werden. Es startet nicht von alleine.
WAR-Datei-Plugin mit Maven-War-Plugin
Stellen wir uns vor, wir haben ein einfaches Webprojekt. Lassen Sie das Projekt eine solche Dateistruktur erhalten. Wie stellen wir sie zusammen?
|-- pom.xml
`-- src
`-- main
|-- java
| `-- com
| `-- example
| `-- projects
| `-- SampleAction.java
|-- resources
| `-- images
| `-- sampleimage.jpg
`-- webapp
|-- WEB-INF
| `-- web.xml
|-- index.jsp
`-- jsp
`-- websource.jsp
Zuerst müssen wir Maven anweisen, das alles als War-Datei zu erstellen. Dafür gibt es ein <package> -Tag , zum Beispiel:
<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>
Zweitens müssen wir das Plugin „maven-war-plugin“ einbinden . Beispiel:
<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>
Hier definieren wir einfach ein Plugin, das in Zukunft konfiguriert werden kann. Mithilfe des webappDirectory- Tags definieren wir außerdem das Verzeichnis neu, in dem das Projekt bereitgestellt wird. Jetzt erzähle ich Ihnen mehr darüber, wovon ich spreche.
Das Plugin kann auf zwei Build-Modi (zwei Arten von Zielen) eingestellt werden:
- Krieg: Krieg
- Krieg:explodiert
Im ersten Fall wird die resultierende WAR-Datei einfach im Zielordner abgelegt und mit dem Namen <artifactId>-<version>.war benannt .
Sie können das Plugin jedoch „anfordern“, dass der Inhalt der WAR-Datei im endgültigen Ordner in dem Zustand abgelegt wird, in dem er vom darin enthaltenen Webserver entpackt wird. Hierzu wird goal war:exploded verwendet .
Der zweite Ansatz wird häufig verwendet, wenn Sie ein Projekt direkt von Intellij IDEA aus ausführen oder debuggen.
Übrigens können Sie mit dem webappDirectory- Tag im obigen Beispiel das Verzeichnis neu definieren, in das Ihre War-Datei entpackt wird, wenn Sie im war:exploded-Modus erstellen.
Weitere Plugin-Einstellungen finden Sie auf der offiziellen Seite .
Erstellen einer Webanwendung basierend auf SpringBoot
Nun, ich würde gerne ein echtes Montagebeispiel zerlegen. Seien wir nicht belanglos und betrachten wir dies anhand einer Beispielanwendung auf Basis von SpringBoot.
Schritt eins. Erstellen Sie mit IDEA ein leeres Maven-Webprojekt.
Schritt zwei. Fügen Sie Spring-Abhängigkeiten zu pom.xml hinzu.
<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>
Schritt drei. Erstellen Sie eine Klasse com.codegym.spring.MainController . Es muss im Ordner src/main/java abgelegt werden :
@Controller
public class MainController {
@GetMapping("/")
public String viewIndexPage(Model model) {
model.addAttribute("header", "Maven Generate War");
return "index";
}
}
Hier werden drei Dinge beschrieben. Erstens teilt die Annotation @Controller dem SpringBoot-Framework mit, dass diese Klasse zur Bearbeitung eingehender Webanfragen verwendet wird.
Zweitens gibt die Annotation @GetMapping an, dass unsere Methode aufgerufen wird, um eine GET-Anfrage für den Root-URI zu bedienen – /
Drittens gibt die Methode die Zeichenfolge „index“ zurück . Dadurch wird das SpringBoot-Framework angewiesen, den Inhalt der Datei index.html als Antwort zurückzugeben .
Schritt vier. Sie müssen dem Projekt eine index.html-Datei mit folgendem Inhalt hinzufügen:
<!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>
Es ist nicht nur HTML. Bevor sein Inhalt an den Client übergeben wird, wird er auf dem Server vom Thymeleaf- Framework geändert . In diese Datei sind spezielle Tags eingebettet, die es der Thymeleaf-Bibliothek ermöglichen, den Inhalt der Seite zu verarbeiten und zu ändern.
Die roten Tags sind die Tags, die von der Thymeleaf-Bibliothek verarbeitet werden, die grünen sind die Stile der Bootstrap-CSS-Bibliothek.
Schritt fünf. Legen Sie das Plugin in pom.xml fest:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
Ich habe meine Kräfte etwas überschätzt. Es nimmt viel Zeit in Anspruch, ein einfaches Beispiel vollständig zu analysieren. Sie können jedoch den vollständigen Code des Projekts von GitHub herunterladen und versuchen, ihn selbst zu verstehen. Übrigens wirst du 80 % deiner Arbeitszeit genau das machen :)
Sie können den vollständigen Code über den Link in GitHub herunterladen .
GO TO FULL VERSION