war文件和jar文件的區別

事實上一個 jar 庫只是一個 zip 存檔,直接從它的名字而來:Java Archive。大多數情況下,它只包含四件事:

  • 編譯類;
  • resources:屬性文件等;
  • 清單 MANIFEST.MF;
  • 其他 jar 庫(很少見)。

這種檔案的典型結構如下所示:

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

現在讓我們看一個典型的戰爭文件。順便說一句, war 不是來自 war 這個詞,而是來自Web Ar chive。war 文件的結構通常更複雜。通常它由兩部分組成:

  • Java部分
    • 編譯類
    • Java 類的資源:屬性文件等
    • 其他 jar 庫(經常)
    • 清單 MANIFEST.MF
  • 網絡部分
    • web-xml - Web 服務部署描述符
    • jsp 小服務程序
    • 靜態網頁資源:HTML、CSS、JS文件

一個典型的 war 文件的例子:

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

重要的!jar 文件只能由 java 機器運行,但要運行 war 文件,必須將其上傳到 Web 服務器。它不會自行啟動。

帶有 maven-war-plugin 的 war 文件插件

假設我們有一個簡單的 Web 項目。讓項目給定這樣一個文件結構,我們如何組裝呢?

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

首先,我們需要告訴 Maven 將所有這些構建為war 文件,為此有一個<package>標籤,例如:

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

其次,我們需要包含maven-war-plugin 插件。例子:

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

這裡我們簡單定義一個插件,以後可以配置。此外,使用webappDirectory標記,我們重新定義項目將部署到的目錄。現在我會告訴你更多關於我在說什麼。

該插件可以設置為兩種構建模式(兩種類型的目標):

  • 戰爭:戰爭
  • 戰爭:爆炸

在第一種情況下,生成的 war 文件只是放在目標文件夾中並命名為<artifactId>-<version>.war

但是你可以“請求”插件,讓war文件的內容以被裡面的web服務器解包的狀態放在final文件夾中。為此,目標war:exploded被使用。

如果您直接從 Intellij IDEA 運行或調試項目,則通常使用第二種方法。

順便說一句,上面示例中的webappDirectory標籤允許您重新定義在 war:exploded 模式下構建時 war 文件將被解包的目錄。

您可以從其官方頁面了解其他插件設置。

基於SpringBoot構建Web應用

好吧,我想反彙編一些真正的彙編示例。讓我們不要小題大做,使用基於 SpringBoot 的示例應用程序來考慮這一點。

步驟1。使用 IDEA 創建一個空的 Maven Web 項目。

第二步。將 Spring 依賴項添加到其 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>

第三步。創建一個類com.codegym.spring.MainController。它需要放在src/main/java文件夾中:

@Controller
public class MainController {

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

這裡描述了 3 件事。首先,@Controller 註釋告訴 SpringBoot 框架該類將用於處理傳入的 Web 請求。

其次,@GetMapping 註釋表示將調用我們的方法來為根 URI 上的 GET 請求提供服務 - /

第三,該方法返回字符串“index”這告訴 SpringBoot 框架返回index.html文件的內容作為響應。

第四步。你需要在項目中添加一個 index.html 文件,內容如下:

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

它不僅僅是html。在將其內容提供給客戶端之前,它會在服務器上被Thymeleaf框架修改。該文件中嵌入了特殊標籤,允許 Thymeleaf 庫處理和修改頁面內容。

紅色顯示將由 Thymeleaf 庫處理的標籤,綠色顯示 Bootstrap CSS 庫的樣式。

第五步。在 pom.xml 中設置插件:

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

我有點高估了自己的實力。完全解析一個簡單的示例需要花費大量時間。但是你可以從 GitHub 下載該項目的完整代碼並嘗試自己理解它。順便說一下,你 80% 的工作時間都會這樣做 :)

您可以從 GitHub 中的鏈接下載完整代碼。