Perbezaan antara fail perang dan jar

Sebenarnya , perpustakaan jar hanyalah arkib zip, yang mengikuti terus dari namanya: Java Archive . Selalunya ia mengandungi hanya empat perkara:

  • kelas yang disusun;
  • sumber: fail sifat dan seumpamanya;
  • nyata MANIFEST.MF;
  • perpustakaan balang lain (jarang berlaku).

Struktur tipikal arkib sedemikian kelihatan seperti ini:

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

Sekarang mari kita lihat fail perang biasa. By the way, perang bukan dari perkataan perang, tetapi dari W eb Ar chive . Struktur fail perang biasanya lebih kompleks. Selalunya ia terdiri daripada dua bahagian:

  • bahagian Jawa
    • kelas yang disusun
    • sumber untuk kelas java: fail sifat dan seumpamanya
    • perpustakaan balang lain (selalunya)
    • nyata MANIFEST.MF
  • bahagian web
    • web-xml - deskriptor penggunaan perkhidmatan web
    • jsp servlets
    • sumber web statik: HTML, CSS, fail JS

Contoh fail perang biasa:

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

Penting! jar boleh dijalankan oleh hanya mesin java, tetapi untuk menjalankan fail perang, ia mesti dimuat naik ke pelayan web. Ia tidak bermula dengan sendirinya.

pemalam fail perang dengan maven-war-plugin

Bayangkan kita mempunyai projek web yang mudah. Biarkan projek itu diberikan struktur fail sedemikian, bagaimana kita memasangnya?

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

Pertama, kita perlu memberitahu Maven untuk membina semua ini sebagai fail perang , terdapat tag <package> untuk this , sebagai contoh:

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

Kedua, kita perlu memasukkan pemalam maven-war-plugin . Contoh:

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

Di sini kami hanya mentakrifkan pemalam yang boleh dikonfigurasikan pada masa hadapan. Selain itu, menggunakan teg webappDirectory , kami mentakrifkan semula direktori tempat projek itu akan digunakan. Sekarang saya akan memberitahu anda lebih lanjut tentang apa yang saya bincangkan.

Pemalam boleh ditetapkan kepada dua mod binaan (dua jenis matlamat):

  • perang:perang
  • perang:meletup

Dalam kes pertama, fail perang yang terhasil hanya diletakkan dalam folder sasaran dan dinamakan <artifactId>-<version>.war .

Tetapi anda boleh "meminta" pemalam supaya kandungan fail perang diletakkan dalam folder terakhir dalam keadaan di mana ia akan dibongkar oleh pelayan web di dalamnya. Untuk ini, perang matlamat:meletup digunakan .

Pendekatan kedua sering digunakan jika anda menjalankan atau menyahpepijat projek terus daripada Intellij IDEA.

Ngomong-ngomong, teg webappDirectory dalam contoh di atas membolehkan anda mentakrifkan semula direktori tempat fail perang anda akan dibongkar apabila membina dalam mod war:exploded.

Anda boleh mengetahui tentang tetapan pemalam lain daripada halaman rasminya .

Membina aplikasi web berdasarkan SpringBoot

Baiklah, saya ingin membuka beberapa contoh pemasangan sebenar. Mari kita tidak menjadi remeh dan pertimbangkan ini menggunakan contoh aplikasi berdasarkan SpringBoot.

Langkah satu. Buat projek web Maven kosong dengan IDEA.

Langkah kedua. Tambahkan kebergantungan Spring pada pom.xmlnya.

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

Langkah ketiga. Buat kelas com.codegym.spring.MainController . Ia perlu diletakkan dalam folder src/main/java :

@Controller
public class MainController {

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

Terdapat 3 perkara yang diterangkan di sini. Pertama, anotasi @Controller memberitahu rangka kerja SpringBoot bahawa kelas ini akan digunakan untuk melayani permintaan web masuk.

Kedua, anotasi @GetMapping , menunjukkan bahawa kaedah kami akan dipanggil untuk menyediakan permintaan GET pada URI akar - /

Ketiga, kaedah mengembalikan rentetan "indeks" . Ini memberitahu rangka kerja SpringBoot untuk mengembalikan kandungan fail index.html sebagai respons .

Langkah keempat. Anda perlu menambah fail index.html pada projek dengan kandungan berikut:

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

Ia bukan hanya html. Sebelum kandungannya diberikan kepada pelanggan, ia akan diubah suai pada pelayan oleh rangka kerja Thymeleaf . Teg khas dibenamkan dalam fail ini, yang membenarkan pustaka Thymeleaf memproses dan mengubah suai kandungan halaman.

Teg berwarna merah ialah teg yang akan diproses oleh pustaka Thymeleaf, yang hijau ialah gaya pustaka CSS Bootstrap.

Langkah kelima. Tetapkan pemalam dalam pom.xml:

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

Saya melebihkan kekuatan saya sedikit. Ia mengambil banyak masa untuk menghuraikan contoh mudah sepenuhnya. Tetapi anda boleh memuat turun kod penuh projek daripada GitHub dan cuba memahaminya sendiri. By the way, 80% masa bekerja anda akan lakukan perkara itu :)

Anda boleh memuat turun kod penuh daripada pautan dalam GitHub .