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 中的链接下载完整代码。