Différences entre les fichiers war et jar

En fait , une bibliothèque jar n'est qu'une archive zip, qui découle directement de son nom : Java Archive . Le plus souvent, il ne contient que quatre éléments :

  • classes compilées ;
  • ressources : fichiers de propriétés, etc. ;
  • manifeste MANIFEST.MF ;
  • autres bibliothèques jar (rares).

La structure typique d'une telle archive ressemble à ceci :

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

Examinons maintenant un fichier war typique. Soit dit en passant , la guerre ne vient pas du mot guerre, mais de W eb Archive . La structure d'un fichier war est généralement plus complexe. Il se compose le plus souvent de deux parties :

  • Partie Java
    • classes compilées
    • ressources pour les classes java : fichiers de propriétés, etc.
    • autres bibliothèques jar (souvent)
    • manifeste MANIFEST.MF
  • composant WebPart
    • web-xml - descripteur de déploiement de service Web
    • servlets jsp
    • ressources web statiques : fichiers HTML, CSS, JS

Un exemple de fichier war typique :

META-INF/
    MANIFEST.MF
WEB-INF/
    web.xml
    jsp/
    	helloWorld.jsp
    classes/
    	static/
    	templates/
    	application.properties
    lib/
    	// *.jar files as libs

Important! jar peut être exécuté uniquement par une machine Java, mais pour exécuter un fichier war, il doit être téléchargé sur un serveur Web. Il ne démarre pas tout seul.

plugin de fichier war avec maven-war-plugin

Imaginons que nous ayons un projet Web simple. Que le projet reçoive une telle structure de fichiers, comment l'assemble-t-on ?

|-- pom.xml
 `-- src
 	`-- main
     	|-- java
     	|   `-- com
     	|   	`-- example
     	|       	`-- projects
     	|           	`-- SampleAction.java
     	|-- resources
     	|   `-- images
     	|   	`-- sampleimage.jpg
     	`-- webapp
         	|-- WEB-INF
         	|   `-- web.xml
         	|-- index.jsp
         	`-- jsp
             	`-- websource.jsp

Tout d'abord, nous devons dire à Maven de construire tout cela en tant que fichier war , il y a une balise <package> pour cela , par exemple :

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

Deuxièmement, nous devons inclure le plugin maven-war-plugin . Exemple:

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

Ici, nous définissons simplement un plugin qui peut être configuré dans le futur. Aussi, à l'aide de la balise webappDirectory , nous redéfinissons le répertoire dans lequel le projet sera déployé. Maintenant, je vais vous en dire plus sur ce dont je parle.

Le plugin peut être paramétré sur deux modes de build (deux types d'objectifs) :

  • guerre : guerre
  • guerre : explosé

Dans le premier cas, le fichier war résultant est simplement placé dans le dossier cible et nommé <artifactId>-<version>.war .

Mais vous pouvez "demander" au plugin pour que le contenu du fichier war soit placé dans le dossier final dans l'état dans lequel il sera décompressé par le serveur web à l'intérieur. Pour cela, le goal war:exploded est utilisé .

La deuxième approche est souvent utilisée si vous exécutez ou déboguez un projet directement à partir d'Intellij IDEA.

D'ailleurs, la balise webappDirectory dans l'exemple ci-dessus vous permet de redéfinir le répertoire dans lequel votre fichier war sera décompressé lors de la construction en mode war:exploded.

Vous pouvez en savoir plus sur les autres paramètres du plugin sur sa page officielle .

Créer une application Web basée sur SpringBoot

Eh bien, je voudrais démonter un exemple d'assemblage réel. Ne soyons pas des bagatelles et considérons cela en utilisant un exemple d'application basée sur SpringBoot.

La première étape. Créez un projet Web Maven vide avec IDEA.

Deuxième étape. Ajoutez des dépendances Spring à son fichier 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>

Troisième étape. Créez une classe com.codegym.spring.MainController . Il doit être placé dans le dossier src/main/java :

@Controller
public class MainController {

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

Il y a 3 choses décrites ici. Tout d'abord, l'annotation @Controller indique au framework SpringBoot que cette classe sera utilisée pour répondre aux requêtes Web entrantes.

Deuxièmement, l'annotation @GetMapping indique que notre méthode sera appelée pour traiter une requête GET sur l'URI racine - /

Troisièmement, la méthode renvoie la chaîne "index" . Cela indique au framework SpringBoot de renvoyer le contenu du fichier index.html en réponse .

Quatrième étape. Vous devez ajouter un fichier index.html au projet avec le contenu suivant :

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

Ce n'est pas seulement html. Avant que son contenu ne soit donné au client, il sera modifié sur le serveur par le framework Thymeleaf . Des balises spéciales sont intégrées dans ce fichier, ce qui permet à la bibliothèque Thymeleaf de traiter et de modifier le contenu de la page.

Les balises en rouge sont les balises qui seront traitées par la bibliothèque Thymeleaf, les vertes sont les styles de la bibliothèque CSS Bootstrap.

Cinquième étape. Définissez le plugin dans pom.xml :

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

J'ai un peu surestimé ma force. L'analyse complète d'un exemple simple prend beaucoup de temps. Mais vous pouvez télécharger le code complet du projet depuis GitHub et essayer de le comprendre vous-même. Au fait, 80% de votre temps de travail vous ne ferez que ça :)

Vous pouvez télécharger le code complet à partir du lien dans GitHub .