当前位置: 首页 > news >正文

全方面熟悉Maven项目管理工具(三)认识mvn的各类构建命令并创建、打包Web工程

1. POM(核心概念)

1.1 含义

POM: Project Object Model,项目对象模型。

DOM: Document Object Model,文档对象模型,和 POM 类似

它们都是模型化思想的具体体现

1.2 模型化思想

POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。

在开发过程中,最基本的做法就是将显示生活中的事物抽象成模型,如何封装模型相关的数据作为一个对象,这样就可以在程序中计算与显示事物相关的数据

1.3 对应的配置文件

POM 理念集中体现在 Maven 工程根目录下 pom.xml 配置文件中。

所以 pom.xml 配置文件就是 Maven 工程的核心配置文件。

其实学习 Maven 就是学习这个文件怎么配置,各个配置有什么用

2. 约定的目录结构(核心概念)

2.1 各个目录的作用

在这里插入图片描述

另外还有一个 target 目录专门存放构建操作输出的结果

2.2 约定目录结构的意义

Maven 为了让构建过程能够尽可能的自动化完成,所以必须约定目录结构的作用。

例如:Maven 执行编译操作,必须先去 Java 源程序目录读取 Java 源代码,然后执行编译,最后把编译结果存放在 target 目录

2.3 约定大于配置

Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦

目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码

手敲代码 (码农) --> 配置事务 (管理层) --> 指定规则 (指导者)

3. 在 Maven 工程中编写代码

3.1主题程序

在这里插入图片描述

主体程序指的是被测试的程序,同时也是将来在项目中真正要使用的程序

package com.renexdemo.mavendemo;public class Calculator {public static int sumOut(int num1,int num2){return num1 + num2;}}

3.2 测试程序

在这里插入图片描述

package com.renexdemo.mavendemo;import org.junit.Test;
/* import static 引入静态方法 或者 类 */
import static com.renexdemo.mavendemo.Calculator.sumOut;
import static org.junit.Assert.*;public class CalculatorTest {@Testpublic void testOutSum(){int i = sumOut(10, 20);/*使用 junit 的断言来判断实际结果和期待结果是否一致如果一致:测试通过,不会抛出异常如果不一致:抛出异常,测试失败*/assertEquals(30,i);}
}

4. 执行 Maven 的构建命令

4.1 要求

运行 Maven 中和构建操作相关的命令时,必须进入到 pom.xml 所在的目录。如果没有在 pom.xml 所在的目录运行 Maven 的构建命令,那么会看到下面的错误信息:

The goal you specified requires a project to execute but there is no POM in this directory

mvn -v 命令与构建操作无关,只要正确配置了 PATH,在任何目录下执行都可以。而构建相关的命令要在 pom.xml 所在目录下运行 —— 操作哪个工程,就进入这个工程的 pom.xml 目录

4.2 清理操作

命令: mvn clean

效果: 删除 target 目录

4.3 编译操作

主程序编译: mvn compile

测试程序编译: mvn test-compile

主体程序编译结果存放的目录: target/classes

测试程序编译结果存放的目录: target/test-classes

4.4 测试操作

命令: mvn test

测试的报告存放的目录: target/surefire-reports

4.5 打包操作

命令: mvn package

打包的结果:jar/war 包

存放的目录: target

4.6 安装操作

命令: mvn install

[INFO] Installing F:\Java\学习案例\MavenCommand\pro01-maven-java\target\pro01-maven-java-1.0-SNAPSHOT.jar to D:\JavaStorage\maven-repo\com\renexdemo\mavendemo\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar[INFO] Installing F:\Java\学习案例\MavenCommand\pro01-maven-java\pom.xml to D:\JavaStorage\maven-repo\com\renexdemo\mavendemo\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.pom

安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。

坐标信息如下:

<groupId>com.renexdemo.mavendemo</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>

在 Maven 仓库中生成的路径如下:

D:\JavaStorage\maven-repo\com\renexdemo\mavendemo\pro01-maven-java\1.0-SNAPSHOT

另外,安装操作还会将 pom.xml 文件转换成 XXX.pom 文件一起存入本地仓库。

所以我们在 Maven 的本地仓库中想看一个 jar 包原始的 pom.xml 文件时,查看对应的 XXX.pom 文件即可(名字发送改变,本质上是同一个文件)。

5. 创建 Maven 版的 Web 工程

5.1 说明

使用 mvn archetype:generate 命令生成 Web 工程时,需要使用一个专门的 archetype。这个专门生成 Web 工程骨架的 archetype 可以参照官网看到它的用法:

在这里插入图片描述

5.1.1 Usage

参考 archetypeGroupId、archetypeArifacId、archetypeVersion 用来指定现在使用的 maven-archetype-webapp 的坐标

5.2 操作

注意:如果在上一个工程的目录下执行 mvn archetype:generate 命令,那么 Maven 会报错:不能在一个非 pom 的工程下再创建其他工程。所以不要再创建好的工程中再创建新的工程,请回到工作空间根目录来操作。

mvn archetype:generate
<!--再选择模板时,选择Webapp-->

5.3 生成的 Web 工程的目录结构

在这里插入图片描述

webapp 目录下有index.jsp

WEB-INF 目录下有 web.xml

5.4 创建 Servlet

正常创建即可,但没有 jar 包(Servlet-api)。

我们创建好 Web 工程后,需要导入 jar 包。

在这里插入图片描述

5.5 配置对 servlet-api.jar 包的依赖

对于不知道详情的依赖可以到https://mvnrepository.com/网站查询。使用关键词搜索,然后在搜索结果列表中选择合适的jar包使用。

在这里插入图片描述

6. 将 Web 工程打包为 war 包

运行 mvn package 命令,生成 war 包的位置如下:
在这里插入图片描述

6.1 生成 Web 工程

在 tomcat 目录中,放入编译好的 war包/解压的war包文件夹,在命令行中调用 tomcat 的startup.bat,让 tomcat 将编译网站跑起来。

tomcat 跑起来后,就可以访问 http://localhost:8080/项目名/

7. 😊前篇快递

  • 认识Maven、Maven如何安装?
  • 坐标、pom.xml文件的解读!

8. 👉好文相推

  • 2-3树思想与红黑树的实现与基本原理
  • ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用
  • B树和B+树的实现原理阐述
http://www.lryc.cn/news/465407.html

相关文章:

  • MySQL中查询语句的执行流程
  • 【代码随想录Day47】单调栈Part02
  • Java全栈经典面试题剖析3】JavaSE面向对象2
  • @JsonIgnoreProperties做接口对接时使用带来的好处
  • SpringBoot整合mybatisPlus实现批量插入并获取ID
  • 实战RAG第一天——llama_index向量索引,查询引擎,搜索知识库问答,全部代码,保姆级教学
  • 大数据治理
  • 云计算作业
  • 复制文件到U盘提示:对于目标文件系统,文件过大
  • SpringBoot+Swagger2.7.0实现汉化(2.8.0不行)
  • c++ 散列表
  • Windows通过netsh控制安全中心防火墙和网络保护策略
  • UML(Unified Modeling Language,统一建模语言)
  • 深⼊理解指针(2)
  • Ubuntu中MySQL远程登录设置
  • typescript 中封装一个 class 来解析接口响应数据
  • [LeetCode] 21. 合并两个有序链表
  • CTFHUB技能树之SQL——MySQL结构
  • Git小知识:合理的分支命名约定
  • Ubuntu如何显示pcl版本
  • wordcloud 字体报错
  • 使用Matplotlib绘制极轴散点图
  • Elasticsearch入门:增删改查详解与实用场景
  • 【AI论文精读6】SELF-RAG(23.10)附录
  • sql-labs靶场第十七关测试报告
  • 面试官:MySQL一次到底插入多少条数据合适啊?
  • WSL2 构建Ubuntu系统-轻量级AI运行环境
  • 什么是凸二次规划问题
  • 解决 Elasticsearch cluster_block_exception 错误的终极指南
  • QT sql驱动错误QMYSQL driver not loaded