Maven的简单介绍
Maven是使用Java语言编写的基于项目对象模型(POM)的项目管理工具。使用Maven可以帮助我们在依赖管理、项目构建及插件使用上更好地管理项目。
Maven的加载原理
Maven会根据pom模型去加载当前项目需要使用的资源。项目每次加载都是先从本地仓库(本机的某个指定的文件夹)去加载,如果没有的话就会去Maven的远程仓库中下载到本地仓库,最后Maven再去加载本地仓库中的资源。
Maven项目结构解释
每个目录解释说明如下:
ideamaven // 项目名
.idea // IDEA中所有项目都会生成这个文件夹
src //当前项目的根目录
main
java //所有的.java源文件存放位置
resource //除了.java文件,其他类型的文件都放入到此目录。在进行编译的时候会将该文件中的所有内容直接放到classes目录
test
java // 编写的所有测试类都放在此目录
ideamaven.iml // IDEA配置文件,IDEA中项目都会生成这个文件
pom.xml // Maven最重要的文件,可以进行依赖引入、配置插件等操作
External Libraries //存放当前项目所有依赖的jar
POM模型中的几种关系
在POM模型中定义了三种关系:依赖、继承、聚合。而Maven基于POM模型的项目管理工具,所以这三种关系在Maven中都存在。
依赖关系
当一个项目需要使用到其他项目的内容时,就可以使用依赖。只要依赖的项目(可以是自己的项目,也可以是开源项目)存在于本地仓库,就可以通过pom.xml的<dependency>
标签填写坐标实现依赖关系。
依赖的传递性
假设项目A依赖项目B,项目B依赖项目C,这时会发现项目A中包含了项目C的依赖,这就是依赖的传递性。
重复依赖原则
路径不同间接依赖中maven采用的是路径最短者优先。
路径相同间接依赖中maven采用的是依赖定义顺序从上到下,下边优先级更高。
继承关系
继承下项目分为父子关系。父项目的<packing>
打包方式可以为jar|pom,无论是jar还是pom,子项目只能继承父项目的pom.xml,并不能继承src/main下的内容,所以通常使用pom。
在父项目中可以通过<dependencyManagement>
管理父项目中的依赖,子项目则可以指定继承那些依赖,当子项目需要这个依赖时坐标<version>
可以省略。
如何区分依赖和继承关系
如果想要使用另一个项目的类,这种关系在Maven中叫做依赖。
如果想要使用另一个项目的依赖,插件,这种关系在Maven中叫做继承。
聚合关系
聚合关系的前提:继承。
聚合主要用在分布式架构或微服务架构的项目。聚合项目最大的好处:在一个父项目中创建多个模块,所有的模块都是独立的,可以独立运行。且父项目不需要install,子模块就可以继承父项目的pom中的依赖。
总结
依赖:
依赖其它项目中的类,主要是src/main中的类。
依赖和被依赖的项目都为独立的项目,依赖存在传递性,常用。
项目必须install后(jar),才能够被其他项目依赖。
继承:
父项目管理子项目的依赖,插件。
父子项目都为独立的项目,springboot开始常用。
项目必须install后(jar|pom),才能够被其它项目继承。
无论jar还是pom只能继承依赖,不能使用src/main中的类,常用pom。
聚合:
父项目管理子项目的依赖,插件。
一个项目中创建多个模块(每个模块可以独立运行),微服务常用。
聚合项目不需要install,每个模块都可以使用父项目中依赖,插件
聚合项目只能为pom,聚合的父项目需要指定管理哪些子项目。
Maven项目的类型
Mavne项目有三种类型:
jar:相当于使用idea创建的java项目。打包主要打包.class文件。
war:web项目类型。打包时除了src中内容,还会包含webapp目录,要比jar类型文件打包的内容更多。通常使用tomcat时项目类型必须指定为war。
pom:聚合项目中使用。聚合项目中如果一个项目为父项目,项目类型应该为pom类型。当项目类型为pom类型时,表示该项目除了会配置pom.xml以外不会有任何其它类或资源文件。
后续可以通过在pom.xml文件中通过<packaging>
设置项目类型。没有配置<packaging>时默认使用jar。
一些Mybatis常用插件
1.资源拷贝插件
存在某种情况:由于一些原因,必须在src/main/java中放置一些非.java文件(例如:MyBatis框架中就有这样的场景),还希望Maven去编译这些文件,这时就必须配置资源拷贝插件。
如何配置资源拷贝插件
<build>
里面可以配置一些插件信息。
<directory>
配置的目录。
<includes>
标签明确配置哪些文件也需要被编译。**/*.txt
中**
表示任意目录及子目录。*.txt
表示任意名称的txt文件。如果希望编译其他类型的文件,例如xml文件,需要在<includes>
里面再配置<include>**/*.xml</include>
就可以了。
<filtering>
表示是否对拷贝的资源进行过滤。简单理解:对资源内容进行处理。例如:在文件中有{占位}编译后希望被解析,就需要设置为true。
2.tomcat插件热部署
使用Maven的Tomcat插件可以实现把项目一键部署到服务器的Tomcat中,这种部署方式不需要重启Tomcat,称为热部署。
想要使用热部署就必须先配置Tomcat自带的manager项目。Manager项目支持可视化管理Tomcat中项目,也知道使用命令管理Tomcat中项目。
修改tomcat插件配置
在配置好Tomcat的远程账号和密码以及角色信息后,Tomcat不能关闭,保持运行状态。在需要远程部署的Maven的项目的pom.xml文件配置远程部署的账号密码以及url地址。
<!--配置插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 域名也可以 -->
<url>http://192.168.8.129:8080/manager/text</url>
<username>admin</username>
<password>admin</password>
<path>/project</path><!-- 发布到Tomcat的名称,也是以后访问的名称 -->
</configuration>
</plugin>
</plugins>
</build>
Maven项目的常用指令
mvn help:system | 打印系统属性和环境变量 |
mvn clean | 删除target目录,清理所有之前所有编译的内容。手动删除target目录和运行此命令是等效的。 |
mvn validate | 验证项目是否可用 |
mvn compile | 编译项目,生成target目录 |
mvn test | 执行测试。执行测试时会自动运行src/test/java 目录下所有/*Test.java、/Test.java、**/TestCase.java 文件,采用约定方式执行。 |
mvn package | 打包项目 |
mvn deploy | 发布项目 |
mvn verify | 校验包是否正确 |
mvn install | 安装到本地仓库 |
mvn site | 生成站点。但是需要添加插件才能使用。 |
Maven项目的生命周期
Maven有三套相互独立的生命周期(Lifecycle ):
Clean Lifecycle:做一些清理工作;
Default Lifecycle:构建的核心部分、编译、测试、打包、部署等;
Site Lifecycle:生成项目报告、站点、发布站点;
其中Default Lifecycle包含如下阶段:
validate
- 验证项目是否正确并且所有必要的信息都可用
compile
- 编译项目的源代码
test
- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码
package
- 将编译后的代码打包成可分发的格式,例如 JAR。
verify
- 对集成测试的结果进行任何检查,以确保满足质量标准
install
- 将包安装到本地存储库中,作为本地其他项目的依赖项
deploy
- 在构建环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享
生命周期的每个阶段必须按照严格的执行顺序,当然我们可以执行任意一个阶段,但是每个阶段都会从第一个阶段开始执行。
scope
在pom.xml中<dependency>
标签有一个<scope>
子标签,表示当前依赖的域(域:有效范围)。
scope可取值
取值 | 解释 |
---|---|
compile | 默认值,不配置scope时的取值,表示依赖参与整个项目的编译、打包、测试、发布。也就是说:编译时需要使用、测试时需要使用、最终打包时会包含。属于一种强依赖。 |
provided | 仅编译时生效,项目最终被打包时不会包含该依赖。常见servlet的依赖时需要配置。 |
runtime | 运行时生效。表示编译时不参与,但是参与项目的测试、打包。该依赖被打包时会被包含。 |
test | 仅测试时生效,这个包中的类只能在src/main/test中使用。常用在junit依赖时需要被配置。 |
system | 类似provided,但是需要结合systemPath属性,表示依赖不是来源于本地库,而是来源于其他目录。使用较少,在一些特殊项目中才可能被使用。 |