Sự khác nhau giữa tập tin war và jar

Trên thực tế , thư viện jar chỉ là một kho lưu trữ zip, xuất phát trực tiếp từ tên của nó: Lưu trữ Java . Thông thường nó chỉ chứa bốn điều:

  • các lớp biên soạn;
  • tài nguyên: tệp thuộc tính và những thứ tương tự;
  • bảng kê khai MANIFEST.MF;
  • các thư viện jar khác (hiếm).

Cấu trúc điển hình của một kho lưu trữ như vậy trông như thế này:

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

Bây giờ hãy xem xét một tập tin chiến tranh điển hình. Nhân tiện, chiến tranh không phải từ chiến tranh, mà từ W eb Ar chive . Cấu trúc của tệp chiến tranh thường phức tạp hơn. Thông thường nó bao gồm hai phần:

  • phần Java
    • lớp tổng hợp
    • tài nguyên cho các lớp java: tệp thuộc tính và những thứ tương tự
    • các thư viện jar khác (thường)
    • bảng kê khai MANIFEST.MF
  • phần web
    • web-xml - bộ mô tả triển khai dịch vụ web
    • jsp servlet
    • tài nguyên web tĩnh: tệp HTML, CSS, JS

Một ví dụ về một tập tin chiến tranh điển hình:

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

Quan trọng! jar chỉ có thể được chạy bởi máy java, nhưng để chạy tệp chiến tranh, nó phải được tải lên máy chủ web. Nó không tự bắt đầu.

plugin tập tin chiến tranh với maven-war-plugin

Hãy tưởng tượng rằng chúng ta có một dự án web đơn giản. Cho project có cấu trúc file như vậy thì chúng ta ráp nó như thế nào?

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

Trước tiên, chúng ta cần yêu cầu Maven xây dựng tất cả những thứ này dưới dạng tệp chiến tranh , ví dụ: có thẻ <package> cho tệp này :

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

Thứ hai, chúng ta cần bao gồm plugin maven-war-plugin . Ví dụ:

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

Ở đây chúng tôi chỉ định nghĩa một plugin có thể được định cấu hình trong tương lai. Ngoài ra, bằng cách sử dụng thẻ webappDirectory , chúng tôi xác định lại thư mục mà dự án sẽ được triển khai. Bây giờ tôi sẽ cho bạn biết thêm về những gì tôi đang nói về.

Plugin có thể được đặt thành hai chế độ xây dựng (hai loại mục tiêu):

  • chiến tranh:chiến tranh
  • chiến tranh: bùng nổ

Trong trường hợp đầu tiên, tệp chiến tranh kết quả chỉ được đặt trong thư mục đích và được đặt tên là <artifactId>-<version>.war .

Nhưng bạn có thể “yêu cầu” plugin để nội dung của tệp chiến tranh được đặt trong thư mục cuối cùng ở trạng thái mà máy chủ web bên trong sẽ giải nén nó. Đối với điều này, mục tiêu war:exploded được sử dụng .

Cách tiếp cận thứ hai thường được sử dụng nếu bạn đang chạy hoặc gỡ lỗi một dự án trực tiếp từ Intellij IDEA.

Nhân tiện, thẻ webappDirectory trong ví dụ trên cho phép bạn xác định lại thư mục nơi tệp chiến tranh của bạn sẽ được giải nén khi xây dựng ở chế độ war:exploded.

Bạn có thể tìm hiểu về các cài đặt plugin khác từ trang chính thức của nó .

Xây dựng ứng dụng web trên SpringBoot

Chà, tôi muốn tháo rời một số ví dụ lắp ráp thực tế. Đừng để những chuyện vặt vãnh và xem xét điều này bằng cách sử dụng một ứng dụng ví dụ dựa trên SpringBoot.

Bước một. Tạo một dự án web Maven trống với IDEA.

Bước hai. Thêm các phụ thuộc Spring vào tệp pom.xml của nó.

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

Bước thứ ba. Tạo một lớp com.codegym.spring.MainController . Nó cần được đặt trong thư mục src/main/java :

@Controller
public class MainController {

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

Có 3 điều được mô tả ở đây. Đầu tiên, chú thích @Controller nói với khung công tác SpringBoot rằng lớp này sẽ được sử dụng để phục vụ các yêu cầu web đến.

Thứ hai, chú thích @GetMapping chỉ ra rằng phương thức của chúng ta sẽ được gọi để phục vụ yêu cầu GET trên URI gốc - /

Thứ ba, phương thức trả về chuỗi "index" . Điều này yêu cầu khung công tác SpringBoot trả về nội dung của tệp index.html dưới dạng phản hồi .

Bước bốn. Bạn cần thêm một file index.html vào project với nội dung như sau:

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

Nó không chỉ là html. Trước khi nội dung của nó được cung cấp cho máy khách, nó sẽ được sửa đổi trên máy chủ bởi khung Thymeleaf . Các thẻ đặc biệt được nhúng trong tệp này, cho phép thư viện Thymeleaf xử lý và sửa đổi nội dung của trang.

Các thẻ màu đỏ là các thẻ sẽ được xử lý bởi thư viện Thymeleaf, các thẻ màu xanh lá cây là các kiểu của thư viện Bootstrap CSS.

Bước năm. Đặt plugin trong pom.xml:

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

Tôi đã đánh giá quá cao sức mạnh của mình một chút. Phải mất rất nhiều thời gian để phân tích đầy đủ một ví dụ đơn giản. Nhưng bạn có thể tải xuống mã đầy đủ của dự án từ GitHub và cố gắng tự hiểu nó. Nhân tiện, 80% thời gian làm việc của bạn, bạn sẽ làm điều đó :)

Bạn có thể tải xuống mã đầy đủ từ liên kết trong GitHub .