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 servlets
    • 静态网页资源: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 中的链接下载完整代码。