标签:Maven、软件工程、jar包管理、开发流程
1.Maven简介
众所周知,在软件开发中我们有一系列流程,包括编译、测试、打包、部署等工作,在没有maven前,大家怎么开发呢,有哪些问题呢?
第一:需要手工导入jar包,并且jar包可能存在依赖、版本问题,加大难度;
第二:对源代码测试困难,尤其是源代码有几千个类的时候;
因此我们引入了Maven,帮助我们完成代码编译、批量测试、管理jar包、一键打包。
值得注意的是,Maven的构建流程与下文的Maven命令息息相关:
第一个:清理代码 mvn clean
第二个:编译源代码 mvn compile
第三个:编译测试代码 mvn test-compile
第四个:运行测试代码? mvn test
第五个:一键打包? mvn package
第六个:部署
第七个:安装? mvn install
2.Maven的核心概念
第一个:POM.XML
简而言之,这个文件时Maven的标志,可以认为和Git一样,Maven是一个项目工程管理者,他会涉足项目的编译、测试、发包和部署环节,那么每个环节做什么?怎么做?需不需要包?有什么结构?这些都需要你在这个文件进行配置,说明!
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhujie</groupId>
<artifactId>day01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
第二个:约定的目录结构
这个很简单,作为管理者的Maven为了让大家遵守它的规范,统一了文件结构的规范,你比如上面的XML文件就是他规定的,除此外具体的规范如下:
?如上图所示,这里位于一个项目XX下,分为src文件夹和pom.xml配置文件,其中src包括源代码和测试文件夹,即main文件夹和test文件夹,main和tese都有java文件夹和resource文件夹,顾名思义,java中包括功能代码和测试代码,resource包括其他的一些用到的资源。
【注意】上面的target是编译后.class文件的放置位置,即编译时Maven会把src/main/java中的*.java编译为target/classes文件夹下的*.class文件,同时把src/main/source下的文件保存在target/classes。
第三个:坐标
如同数学的坐标一样,这里Maven会唯一标识一个网络项目/jar包【因为后续我们会发包】
groupId 组织id,一般是域名倒写,如com.baidu.appolo
artifactId 项目名字,模块名
version 项目版本号 -snapshot
【注意】其实坐标可以随便写,不过按照上面的规范大家都可以看得懂。
【注意2】可以在www.mvnreposity.com中央仓库查询想要的jar包,会自动返回POM.XML的引用格式,将其插入到POM.XML即可,如下为servlet的一个版本jar包:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
第四个:依赖管理、仓库管理
依赖就是jar包,我们写的代码可能需要java自带类,例如javaee规范中的javax旗下的servlet类,这时就必须引入依赖,Maven要求我们把想要的包在POM.XML告诉他,他负责下载,那么怎么下载呢?这就涉及到仓库管理:
在Maven中,仓库分为本地仓库、私服、中央仓库镜像、中央仓库
简而言之,Maven会先从本地仓库中查询,然后去私服、中央仓库镜像、中央仓库依次查询,如果后面任何一个地点查到了,那么依次返回并且缓存,其本质类似于DNS的递归查询方式。
【注意】本地仓库可以在Maven安装目录/setting.xml文件夹中的localreposity配置,加上本地的某个专门存放仓库的文件夹即可,注意这里加入的一定是/,而不是\。第五个:
第五个:插件
在Maven中,插件是命令的实际执行者,可以理解为是一个可执行文件,其本质是一个jar包,每次执行命令时,Maven也会去找有无jar包,没有就会立刻下载并且执行命令。
第六个:继承和聚合
第七个:单元测试→junit下的测试方法;
在Maven中,测试的基本单位是方法,故称之为单元测试。
其中,测试类的名称为Test+要测试的类名,测试方法名为test+要测试的方法名,除此外,测试方法必须是public、没有返回值、在方法上面要加上@Test,如下所示:
package com.bjpowernode;
import org.junit.*;
public class Testhh{
@Test
public void testmain(){
System.out.println("maven的junit测试");
hh a = new hh();
int out = hh.add(3,6);
//调用junit的测试方法,对比结果
//assertEquals(期望值,实际值)
//如果不等就抛出异常;
Assert.assertEquals(10,out);
}
}
3.Maven生命周期详解_命令详解
这里演示Maven命令与生命周期,假设已经建立好了所需要的文件结构【见上文】,假设根目录为XX/:
第零步:配置POM.XML,写代码
在POM.xml中,模板如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 坐标设置-->
<groupId>com.zhujie</groupId>
<artifactId>java_web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 自定义添加进入target的资源-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.txt</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
<!-- 设置依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!-- JSP依赖依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.0</version>
<scope>provided</scope>
</dependency>
<!-- servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
简而言之,需要设立坐标【告诉Maven你是谁】、引入依赖【告诉Maven你想要哪些jar包】、设置资源【告诉Maven你想要把src/main/java下哪些文件放在target/classess文件夹下】、依赖管理【你想要这个依赖在编译、测试、打包、部署的哪个阶段起作用】
第一步:进入XX,输入mvn clean清理命令
【结论】此时会出现maven-clean-plugin,不难发现Maven的命令是通过插件完成的!
第二步:mvn compile
【结论】将.java编译后的class文件放在target/classes,并且拷贝main/source文件夹下的文件到前者。
第三步:mvn test-compile
【结论】编译test/java下的文件,放在target/classes
第四步:mvn test
【结论】此方法会再次执行前面的几个命令,然后执行.calss文件
【结论2】这里会生成测试的结果报告,在target/surefire-reports下。
第五步:mvn package
【结论】默认打包为jar,可以在POM设置为war
【结论2】取名为artifactId-version值。
【结论3】打包生成的内容由POM中的<soupe>字段给出。
第六步:mvn install
【结论】安装到本地仓库位置,按.分包分层级建文件夹
4.IDEA创建Maven普通javase模块
首先明确的是,IDEA自带Maven,但是很难用,故需要手动覆盖。
第一步:新建任意项目
第二步:新建普通javase模板,设置模块坐标
第三步:覆盖Maven?
值得注意的是,建议在VM option输入以下命令,加快下一次启动速度:
-DarchetypeCatalog=internal
特别的,以上设置分局部和全局:
第四步:标记文件夹
第五步:写主代码、写测试代码、引入jar包
第六步:测试,双击运行:
5.IDEA创建Maven_web开发
第一步:新建模块,选择Maven→webapp原型
第二步:标记文件夹并补全
第三步:手动配置pom.xml的<packaging>为war格式
第四步: 引入servlet和jsp依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
第五步:注册web.xml和index.jsp
第六步:后端servlet小程序撰写暨Tomcat服务器配置
第七步:打包发布
6.Maven技巧与依赖管理
第一点:本地仓库设置
可以在Maven的配置文件夹下设置本地仓库,也可以在IDEA设置,如下图:
? ?
第二点:解决Maven无法识别依赖包问题
有时候,Maven会将我们添加的依赖包标红,此时可以在模块下的pom配置文件右键选择maven,然后选择重新加载文件,当然也可以在Maven主控制面板刷新,后者会将所有Maven项目更新。
第三点:设置标记目录
在Maven和IDEA中,建立的普通目录是普通文件,我们需要告诉Maven它是什么类型的文件:
?第四点:导入Maven模块
项目结构→导入模块→选择maven→设置jdk→完毕!
第五点:指定全局变量,以此快速修改版本号
在哪里指定?? 在properties标签中;
怎么指定和使用?? ? ? ? ? ? ? ? 如下:
<properties>
<spring.version>5.2.2</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${sprinig.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-linx</artifactId>
<version>${sprinig.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hint</artifactId>
<version>${sprinig.version}</version>
</dependency>
第六点:指定资源插件
做法:在如下的<build>标签中引入resource标签,指定想要拷贝到target/classes的文件。
?第七点:依赖管理
? ?前面讲到,POM.XML文件中有<scope>标签,如下所示:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
?他表示什么意思呢?? ? ? ? ? ? ? ? ? ? ? ?他表示该依赖在Maven的哪些阶段起作用!
分为:compile、test、provided三者,阶段分为编译、测试、打包、部署四个阶段。
其中compile表示该依赖在四个阶段都需要,都起作用;
test表示只在测试阶段登场,其他阶段不需要它;
provided表示在编译和测试阶段都需要,其他节阶段不需要。
例如我们引入的mysql 的驱动jar包,显然在编译和测试阶段需要,其他阶段不需要,而src/main/java下的*.java文件则需要贯穿各个阶段。
第八点:巧妙使用jar包
前面讲了jar包的配置、下载、引入和发布,除此外,jar作为前后台程序/页面的封装,还可以快速访问站点:
第一步:将.war改名为某个站点的名字
第二步:放在tomcat的webapp根目录下
第三步:http://localhost:8080/crm/baidu
- 之类crm是某个站点
- /baidu是该servlet的映射路径
- 原理:访问的时候Tomcat会自动替换;
第四步:成功
7.总结
第一点:git是版本控制,解决了文件备份和协作的问题,而Maven作为项目管理工具,深度参与项目的编译、测试、打包和部署过程,解决了工程实现问题,Tomcat服务器作为web服务器,其可看成是后台开发者和浏览器前端的传输中间人。
第二点:接第一点,有时我们可以站在更高的维度思考问题,不仅要作为后台程序开发者和工具使用者的角色,有时可以考虑中间人的角色,例如如何写出Tomcat,如何写出Maven,如何设计实现git,不管结果如何,都会加深工具的使用以及规范的实现。
?
|