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 .