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 中的鏈接下載完整代碼。
GO TO FULL VERSION