Diferencias entre archivos war y jar

De hecho , una biblioteca jar es solo un archivo zip, que se deriva directamente de su nombre: Java Archive . La mayoría de las veces contiene solo cuatro cosas:

  • clases compiladas;
  • recursos: archivos de propiedades y similares;
  • manifiesto MANIFIESTO.MF;
  • otras bibliotecas jar (raro).

La estructura típica de un archivo de este tipo se ve así:

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

Ahora veamos un archivo de guerra típico. Por cierto, guerra no es de la palabra guerra, sino de W eb Archive . La estructura de un archivo war suele ser más compleja. La mayoría de las veces consta de dos partes:

  • Parte Java
    • clases compiladas
    • recursos para clases java: archivos de propiedades y similares
    • otras bibliotecas jar (a menudo)
    • manifiesto MANIFIESTO.MF
  • elemento web
    • web-xml: descriptor de implementación del servicio web
    • servlets jsp
    • recursos web estáticos: archivos HTML, CSS, JS

Un ejemplo de un archivo de guerra típico:

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

¡Importante! jar se puede ejecutar solo con una máquina java, pero para ejecutar un archivo war, debe cargarse en un servidor web. No comienza solo.

Complemento de archivo war con maven-war-plugin

Imaginemos que tenemos un proyecto web sencillo. Deje que el proyecto tenga una estructura de archivos de este tipo, ¿cómo lo ensamblamos?

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

Primero, debemos decirle a Maven que cree todo esto como un archivo war , hay una etiqueta <package> para esto , por ejemplo:

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

En segundo lugar, debemos incluir el complemento maven-war-plugin . Ejemplo:

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

Aquí simplemente definimos un complemento que se puede configurar en el futuro. Además, al usar la etiqueta webappDirectory , redefinimos el directorio en el que se implementará el proyecto. Ahora les cuento más de lo que les hablo.

El complemento se puede configurar en dos modos de construcción (dos tipos de objetivo):

  • guerra: guerra
  • guerra: estalló

En el primer caso, el archivo war resultante simplemente se coloca en la carpeta de destino y se denomina <artifactId>-<version>.war .

Pero puede "pedir" al complemento para que el contenido del archivo war se coloque en la carpeta final en el estado en el que el servidor web lo desempaquetará. Para ello se utiliza el objetivo war:exploded .

El segundo enfoque se usa a menudo si está ejecutando o depurando un proyecto directamente desde Intellij IDEA.

Por cierto, la etiqueta webappDirectory en el ejemplo anterior le permite redefinir el directorio donde se descomprimirá su archivo war cuando se construya en modo war:exploded.

Puede obtener información sobre la configuración de otros complementos desde su página oficial .

Construyendo una aplicación web basada en SpringBoot

Bueno, me gustaría desmontar algún ejemplo de montaje real. No seamos bagatelas y consideremos esto usando una aplicación de ejemplo basada en SpringBoot.

Paso uno. Cree un proyecto web Maven vacío con IDEA.

Segundo paso. Agregue dependencias de Spring a su 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>

Paso tres. Cree una clase com.codegym.spring.MainController . Debe colocarse en la carpeta src/main/java :

@Controller
public class MainController {

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

Hay 3 cosas descritas aquí. Primero, la anotación @Controller le dice al marco SpringBoot que esta clase se usará para atender las solicitudes web entrantes.

En segundo lugar, la anotación @GetMapping indica que se llamará a nuestro método para atender una solicitud GET en el URI raíz - /

Tercero, el método devuelve la cadena "index" . Esto le dice al marco SpringBoot que devuelva el contenido del archivo index.html como respuesta .

Paso cuatro. Debe agregar un archivo index.html al proyecto con el siguiente contenido:

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

No es solo html. Antes de entregar su contenido al cliente, Thymeleaf framework lo modificará en el servidor . Las etiquetas especiales están incrustadas en este archivo, lo que permite que la biblioteca Thymeleaf procese y modifique el contenido de la página.

Las etiquetas en rojo son las etiquetas que serán procesadas por la biblioteca Thymeleaf, las verdes son los estilos de la biblioteca Bootstrap CSS.

Paso cinco. Configure el complemento en pom.xml:

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

Sobrestimé un poco mi fuerza. Se necesita mucho tiempo para analizar completamente un ejemplo simple. Pero puede descargar el código completo del proyecto desde GitHub e intentar comprenderlo usted mismo. Por cierto, el 80% de tu tiempo de trabajo lo harás :)

Puede descargar el código completo desde el enlace en GitHub .