Różnice między plikami wojny i jar

W rzeczywistości biblioteka jar to po prostu archiwum ZIP, co bezpośrednio wynika z jej nazwy: Archiwum Java . Najczęściej zawiera tylko cztery rzeczy:

  • klasy skompilowane;
  • zasoby: pliki właściwości i tym podobne;
  • manifest MANIFEST.MF;
  • inne biblioteki jar (rzadko).

Typowa struktura takiego archiwum wygląda następująco:

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

Przyjrzyjmy się teraz typowym aktom wojennym. Nawiasem mówiąc, wojna nie pochodzi od słowa wojna, ale od Web Archive . Struktura akt wojennych jest zwykle bardziej złożona. Najczęściej składa się z dwóch części:

  • Część Jawa
    • skompilowane klasy
    • zasoby dla klas Java: pliki właściwości i tym podobne
    • inne biblioteki jar (często)
    • manifest MANIFEST.MF
  • część internetowa
    • web-xml — deskryptor wdrażania usługi sieciowej
    • serwlety jsp
    • statyczne zasoby sieciowe: pliki HTML, CSS, JS

Przykład typowego pliku wojennego:

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

Ważny! jar może być uruchamiany tylko przez maszynę Java, ale aby uruchomić plik wojenny, należy go przesłać na serwer WWW. Nie uruchamia się samoczynnie.

wtyczka pliku wojny z wtyczką maven-war

Wyobraźmy sobie, że mamy prosty projekt internetowy. Niech projekt otrzyma taką strukturę plików, jak to skompletujemy?

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

Najpierw musimy powiedzieć Mavenowi, aby zbudował to wszystko jako plik wojenny , jest do tego tag <package> , na przykład:

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

Po drugie, musimy dołączyć wtyczkę maven-war-plugin . Przykład:

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

Tutaj po prostu definiujemy wtyczkę, którą można skonfigurować w przyszłości. Ponadto za pomocą tagu webappDirectory redefiniujemy katalog, w którym zostanie wdrożony projekt. Teraz powiem ci więcej o tym, o czym mówię.

Wtyczkę można ustawić na dwa tryby budowania (dwa rodzaje celów):

  • wojna: wojna
  • wojna: eksplodowała

W pierwszym przypadku wynikowy plik wojny jest po prostu umieszczany w folderze docelowym i nazywany <artifactId>-<version>.war .

Ale możesz „poprosić” wtyczkę, aby zawartość pliku wojny została umieszczona w folderze końcowym w stanie, w jakim zostanie rozpakowana przez serwer WWW w środku. W tym celu używany jest cel war:exploded .

Drugie podejście jest często używane, jeśli uruchamiasz lub debugujesz projekt bezpośrednio z Intellij IDEA.

Nawiasem mówiąc, tag webappDirectory w powyższym przykładzie pozwala na ponowne zdefiniowanie katalogu, w którym plik wojny zostanie rozpakowany podczas budowania w trybie wojna:rozstrzelony.

Możesz dowiedzieć się o innych ustawieniach wtyczki z jej oficjalnej strony .

Budowa aplikacji webowej w oparciu o SpringBoot

Cóż, chciałbym zdemontować jakiś prawdziwy przykład montażu. Nie bądźmy drobiazgami i rozważmy to na przykładowej aplikacji opartej na SpringBoot.

Krok pierwszy. Utwórz pusty projekt internetowy Maven za pomocą IDEA.

Krok drugi. Dodaj zależności Springa do pliku 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>

Krok trzeci. Utwórz klasę com.codegym.spring.MainController . Należy go umieścić w folderze src/main/java :

@Controller
public class MainController {

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

Opisano tutaj 3 rzeczy. Po pierwsze, adnotacja @Controller mówi frameworkowi SpringBoot, że ta klasa będzie używana do obsługi przychodzących żądań sieciowych.

Po drugie, adnotacja @GetMapping wskazuje, że nasza metoda zostanie wywołana do obsługi żądania GET na głównym URI - /

Po trzecie, metoda zwraca ciąg „index” . To mówi frameworkowi SpringBoot, aby zwrócił zawartość pliku index.html jako odpowiedź .

Krok czwarty. Do projektu należy dodać plik index.html o następującej treści:

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

To nie tylko html. Zanim jego zawartość zostanie przekazana klientowi, zostanie zmodyfikowana na serwerze przez framework Thymeleaf . W pliku tym osadzone są specjalne znaczniki, które pozwalają bibliotece Thymeleaf przetwarzać i modyfikować zawartość strony.

Tagi na czerwono to tagi, które będą przetwarzane przez bibliotekę Thymeleaf, zielone to style biblioteki CSS Bootstrap.

Krok piąty. Ustaw wtyczkę w pom.xml:

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

Trochę przeceniłem swoje siły. Pełne przeanalizowanie prostego przykładu zajmuje dużo czasu. Ale możesz pobrać pełny kod projektu z GitHub i spróbować samemu go zrozumieć. Nawiasem mówiąc, 80% swojego czasu pracy będziesz robić właśnie na tym :)

Możesz pobrać pełny kod z linku w GitHub .