一、Maven介绍及加载原理
1.介绍
Maven是使用Java语言编写的基于项目对象模型(POM)的项目管理工具。开发者可以通过一小段描述信息来管理项目的构建、报告和文档。
使用Maven可以更好的帮助我们完成项目的管理,具体分类:
依赖管理:
Maven给每个项目提供了一个pom.xml文件,我们可以在其中配置我们需要的第三方资源,当pom.xml文件发生变化的时候Maven会重新加载该配置文件,根据配置信息查找对应的第三方资源并导入到项目中使用。
项目构建:
Maven提供了统一的项目构建方式,从编译到部署,并且操作简单。
插件:
Maven提供了丰富的插件,比如项目打包插件,测试插件,Tomcat插件等等。
2.Maven加载原理
Maven工具会根据pom模型(pom.xml)加载当前项目需要使用的资源。
每次加载都是从本机某个指定的文件夹去加载。如果本机文件夹中没有这个资源,会从Maven远程服务器中下载到本机文件夹,Maven再去加载本机文件夹中资源。
专业概念: 中央仓库(Central Repository):Maven官方服务器。里面存放了绝大多数市面上流行的jar。也允许用户注册后,上传自己的项目到官方服务器。 本地仓库(Local Repository): 本机的文件夹。 镜像仓库(Mirror Repository):对于国内来说,访问国外的Maven仓库会特别慢。镜像仓库就是另一台备份/复制了中央仓库的服务器。平时使用时国内开发者多使用阿里云镜像或华为云镜像,这样可以大大提升从中央仓库下载资源的速度。 资源坐标:每个Maven需要使用的资源都有一个坐标,通过坐标可以精确告诉服务器需要的是哪个资源由三部分组成: GroupId:一般是逆向公司域名 com.zqwl。同一个公司的GroupId都是相同的。 ArtifactId:一般是项目(jar)名 mysql-connector-java。 Version:版本号 8.0.28。
3.Maven项目的生命周期
Maven有三套相互独立的生命周期(Lifecycle ):
-
Clean Lifecycle:做一些清理工作;
-
Default Lifecycle:构建的核心部分、编译、测试、打包、部署等;
-
Site Lifecycle:生成项目报告、站点、发布站点;
其中Default Lifecycle包含如下阶段:
-
validate
- 验证项目是否正确并且所有必要的信息都可用 -
compile
- 编译项目的源代码 -
test
- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码 -
package
- 将编译后的代码打包成可分发的格式,例如 JAR。 -
verify
- 对集成测试的结果进行任何检查,以确保满足质量标准 -
install
- 将包安装到本地存储库中,作为本地其他项目的依赖项 -
deploy
- 在构建环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享
生命周期的每个阶段必须按照严格的执行顺序,当然我们可以执行任意一个阶段,但是每个阶段都会从第一个阶段开始执行。
4.Maven和Ant对比
Ant和Maven都是Apache的项目管理工具,也都是Java程序非常常用的编译、运行、测试、打包工具。虽然都是项目管理工具,但是因为Maven就是基于Ant研究出来的,可以说Ant有的功能Maven都有,但是Maven有的功能Ant不一定有。
无论是IDEA还是Eclipse,Java项目都默认使用Ant进行项目的管理。在老Ant项目中需要自己添加build文件,但是在目前的java项目中已经不再需要自己进行管理,都是通过idea或eclipse帮助管理即可。
二、IDEA集成Maven
1.默认配置
IDEA 菜单 File -> Settings -> Build,Execution,Deployment -> Build Tools -> Maven。
IDEA中默认已经集成了Maven(安装IDEA时,IDEA软件里面已经包含了Maven软件,不需要单独下载Maven),可以不用做任何修改。如果想要修改,可以按照图示(1)(2)(3)箭头所指进行修改即可。(建议不修改)
(1)默认IDEA 2019.2.4中集成3.6.1。安装上IDEA已经自带了这个Maven,不需要去官网下载。
(2)User settings file:默认集成Maven的配置文件,请注意此目录。通过勾选(2)箭头所指复选框,可以修改配置文件路径。
(3)Local repository: 本地仓库路径。和配置文件是同一个文件夹。 通过勾选(3)箭头所指复选框,可以修改本地仓库路径。
三、Maven项目结构详解
1.解释说明
2.pom.xml文件内容说明
创建的Maven项目在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.bjsxt</groupId>
<artifactId>ideamaven</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
其中:
<project>
是根标签,必须得有的。
<modelVersion>
自动生成,指定pom默认版本。对于Maven 2.x、Maven 3.x中modelVersion必须是4.0.0。
<groupId>
、<artifactId>
、<version>
表示当前项目的坐标,里面信息都是在新建项目时填写的信息。
四、资源拷贝插件(MyBatis框架必用)
1.项目类型介绍
Maven的项目类型有三种:
jar:相当于我们之前使用idea创建的java项目。打包主要打包.class文件。
war:web项目类型。打包时除了src中内容,还会包含webapp目录,要比jar类型文件打包的内容更多。
pom:聚合项目中使用。聚合项目中如果一个项目为父项目,项目类型应该为pom类型。当项目类型为pom类型时,表示该项目除了会配置pom.xml以外不会有任何其它类或资源文件。
2.如何修改项目类型
在pom.xml文件中通过<packaging>
设置项目类型。
小提示:
pom.xml中默认没有配置
<packaging>
标签。当没有配置<packaging>
时等效于<packging>jar<packaging>
。
<?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.aaa</groupId>
<artifactId>firstweb</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
五、使用Maven创建Web项目
1.介绍
使用Maven创建Web项目有两种方式:
(1)创建普通Maven项目,手动添加webapp目录。
(2)使用原型创建Maven项目,手动添加src目录。
1.1创建普通Maven项目
1.2手动添加目录
在src/main下新建webapp/WEB-INF/web.xml。
小提示:
1. webapp目录名称不要写错了,写错了即使在WEB模块进行配置也无效。同时位置也应该放在src/main下,如果放在别的位置,也会出现即使配置了也无效的情况。
2. WEB-INF目录注意全是大写的,单词别写错。
4. web.xml文件在今天授课目录/软件中有,可以直接复制过来。
5. 如果不按照图示进行创建,可能导致最后发布到tomcat后出现404。例如:把webapp建立为web,例如:把webapp放在了src下等路径和名称不一样都可能出现运行后404.
1.3添加web模块
创建的webapp目录默认是不会被编译的,右键点击webapp目录时, 选择New也没有JSP文件。
选择IDEA菜单 File -> Project Structure...
分别点击 Modules -> + -> Web
1.4编辑web模块
需要修改两处:
(1)Deloyment Descriptors部分,点击右侧修改按钮,选择当前项目的web.xml文件。一定要选当前项目的web.xml。
(2)Web Resource Diectory 部分,需要先选中红色方框部分,才能点击右侧的修改按钮。在弹出框中选择当前项目的webapp目录。
1.5验证
设置了web模块后,会发现项目中webapp前面图标多了一个点(谨记:当且仅当文件夹有这个点时才能新建jsp,才会被编译,如果这个点突然消失了,重复上面的步骤就可以了)。
2.1新建项目
使用原型创建web项目,在新建项目部分就有区别:
1. 先勾选create from archetype前面的复选框。
2. 然后选择org.apache.maven.archetypes:maven-archetype-webapp
-
新建项目的剩余步骤都点击Next按钮即可,和不使用原型时创建Maven项目类似。示例中新建的项目叫做mavenweb2.
2.2添加Java目录
使用原型创建的项目自动包含webapp文件夹,且文件夹图标里面有个点,说明已经设置了web模块。里面已经包含了META-INF/web.xml,还自动包含了index.jsp
但是项目里面没有编写Java类的目录,需要手动添加。在src/main下新建java文件夹。
2.3设置java目录为资源目录
当鼠标右键点击java文件夹时,会发现New中没有class这项。说明IDEA并没有识别java文件夹为资源文件夹,需要编辑设置。
2.4验证结果
设置完成后会发现java目录由灰色变为资源文件夹颜色,鼠标右键点击java目录后在New里面可以发现class选项。
2.5如果创建后控制台报错,找不到资源
解决办法:更换镜像源
可以先试一下阿里的镜像。去C:\Users\smallming.m2\settings.xml把
<mirror>
换成阿里的。再次重新创建项目如果还是不好使,把settings.xml中
<mirror>
删除,使用原生镜像进行下载,但是会非常慢。
六、使用Maven的Tomcat插件发布项目搭配Tomcat中
1.介绍
Maven带有插件功能,可以把其他软件集成进来,对Maven的功能进行扩展。使用Tomcat插件不需要在本机下载Tomcat软件,由Maven自动下载插件,插件中包含了Tomcat软件
2.配置插件
在项目的pom.xml中配置Tomcat插件。
配置时包含两个步骤:
(1)设置项目类型为war,这个事情后面总有人忘记。如果没有修改成war,运行时控制台会显示BUILD SUCCESS。而不是正常web项目启动日志。
(2)在<build>
中添加Tomcat7插件
<?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.bjsxt</groupId>
<artifactId>mavenweb1</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 必须设置项目类型为war -->
<packaging>war</packaging>
<build>
<plugins>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/${project.artifactId}</path><!--发布到Tomcat的名称,即URL访问名称,平时多使用/-->
<port>8081</port><!-- 端口,平时多使用80或8080 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
3.启动Tomcat
点击IDEA右侧Maven面板,选择要运行的项目 -> Plugins -> tomcat7 -> tomcat7:run
4.观察启动结果
观察控制台启动结果。可以直接点击URL,会弹出浏览器,点击这个URL,会自动跳出浏览器。
5.关闭和重启的强调
没有关闭Tomcat,再次启动会出现端口号冲突问题
如果当前有一个Tomcat在运行,而又去点击Maven面板的tomcat7:run 会在Run面板上面选项卡又出现了一项,并且在控制台提示端口号冲突。
七、POM模型中的几种关系
1.介绍
在POM模型中定义了三种关系:依赖、继承、聚合。
Maven基于POM模型的项目管理工具,所以这三种关系在Maven中都存在。
2.依赖关系
当一个项目需要使用到其他项目的内容时,就可以使用依赖。只要依赖的项目(可以是自己的项目,也可以是开源项目)存在于本地仓库,就可以通过pom.xml的<dependency>
标签填写坐标实现依赖关系。
查询需要依赖的项目。网址:https://mvnrepository.com/
1.配置依赖
需要在pom.xml中添加<dependencies>
标签,此标签下面可以有多个<dependency>
子标签,表示当前项目所有依赖的项目。
<?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.bjsxt</groupId>
<artifactId>dependencydemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</project>
配置后正常可以自动下载,如果没有自动下载可以点击Maven面板左上角的刷新按钮。
2.依赖的传递性
1.解释
假设项目A依赖项目B,项目B依赖项目C,这时会发现项目A中包含了项目C的依赖,这就是依赖的传递性。
2.重复依赖问题
当项目中依赖内容比较多时,可能出现重复依赖的问题,尤其依赖传递性导致的重复依赖。
重复依赖原则:
路径不同间接依赖中maven采用的是路径最短者优先。
路径相同间接依赖中maven采用的是依赖定义顺序从上到下,下边优先级更高。
3.继承关系
1.介绍
继承下项目分为父子关系。父项目的<packing>
打包方式可以为jar|pom,无论是jar还是pom,子项目只能继承父项目的pom.xml,并不能继承src/main下的内容,所以通常使用pom。
<packing></packing>
的选项:
pom:往往是作为父项目的角色,在父项目的pom.xml中统一管理子项目的依赖,插件,并不会将代码放到pom工程中。
jar:jar就是我们经常引入的jar包或引入的依赖,本质就是java项目中字节码文件,我们是调用它里面的类,一般的jar包只包含类,配置文件,依赖,插件,不会存在静态资源等。
war:本质就是web项目,跟jar不同的是它可以有静态资源的存在,比如Html,css,图片等等。
2.继承和依赖的区别
-
如果想要使用另一个项目的类,这种关系在Maven中叫做依赖。
-
如果想要使用另一个项目的依赖,插件,这种关系在Maven中叫做继承。
3.继承管理
继承关系下父项目的依赖,子项目会全部继承。通过父项目的设置,子类可以选择继承哪些依赖。在父项目中可以通过<dependencyManagement>
管理父项目中的依赖,子项目则可以指定继承那些依赖。
在父项目中可以通过<pluginManagement>
管理父项目中的插件,子项目则可以选择继承哪些插件。
4.聚合关系
1.说明
聚合关系的前提:继承。
好处:在一个父项目中创建多个模块,所有的模块都是独立的,可以独立运行。且父项目不需要install,子模块就可以继承父项目的pom中的依赖。
在聚合项目中,父项目是pom类型。pom类型项目是否有类或放入资源文件都不会被编译。如果想要追求项目的更加简洁,可以删除父项目的src文件夹。
5.总结(依赖,继承,聚合)
-
依赖:
-
依赖其它项目中的类,主要是src/main中的类。
-
依赖和被依赖的项目都为独立的项目,依赖存在传递性,常用。
-
项目必须install后(jar),才能够被其他项目依赖。
-
-
继承:
-
父项目管理子项目的依赖,插件。
-
父子项目都为独立的项目,springboot开始常用。
-
项目必须install后(jar|pom),才能够被其它项目继承。
-
无论jar还是pom只能继承依赖,不能使用src/main中的类,常用pom。
-
-
聚合:
-
父项目管理子项目的依赖,插件。
-
一个项目中创建多个模块(每个模块可以独立运行),微服务常用。
-
聚合项目不需要install,每个模块都可以使用父项目中依赖,插件
-
聚合项目只能为pom,聚合的父项目需要指定管理哪些子项目。
-
八、单元测试
1.介绍
单元测试:独立运行项目中某个或某些方法。
Java中常见的单元测试工具:Junit
在Maven项目中src/main/test包是专门编写单元测试的包。
2.使用
1.导入依赖
<?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.bjsxt</groupId>
<artifactId>command</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.编写测试类
在类中提供任意方法,方法上添加@Test注解,双击方法名后,鼠标右键点击Run 方法名,运行方法。
/*
单元测试:
正常情况下,项目应该有一个主方法,通过运行主方法所在类,让整个项目运行起来。
在项目规格比较大的情况下,如果希望只测试其中某个方法,单独运行一个方法,这时就叫单元测试。
junit单元适用于非web环境。
*/
public class MyTest {
/*
适用于只需要在方法上添加@Test注解。
*/
@Test
public void test(){
System.out.println("test");
}
/*
要求方法必须是public void的,如果不是会出现运行时异常。
*/
@Test
public void test123(){
System.out.println("test2");
}
@Before
public void isbefore(){
System.out.println("before");
}
@After
public void after(){
System.out.println("after");
}
}
九、scope
1.介绍
在pom.xml中<dependency>
标签有一个<scope>
子标签,表示当前依赖的域(域:有效范围)。
compile | 默认值,不配置scope时的取值,表示依赖参与整个项目的编译、打包、测试、发布。也就是说:编译时需要使用、测试时需要使用、最终打包时会包含。属于一种强依赖。 |
provided | 仅编译时生效,项目最终被打包时不会包含该依赖。常见servlet的依赖时需要配置。 |
runtime | 运行时生效。表示编译时不参与,但是参与项目的测试、打包。该依赖被打包时会被包含。 |
test | 仅测试时生效,这个包中的类只能在src/main/test中使用。常用在junit依赖时需要被配置。 |
system | 类似provided,但是需要结合systemPath属性,表示依赖不是来源于本地库,而是来源于其他目录。使用较少,在一些特殊项目中才可能被使用。 |
2.使用方式
在pom.xml中配置依赖时添加<scope>
标签就可以了。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>