Maven学习笔记
文章目录
一、什么是maven
- Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
- Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理
- 使用Maven的优点
-
- 方便jar包的管理
- 不需要上传jar包上svn
-
二、使用Maven
2.1 安装Maven,配置环境
- 官网下载地址
- 配置环境变量
- 我的电脑->属性->高级系统设置->环境变量
- 新建系统变量
- 变量名:MAVEN_HOME
- 变量值:解压的maven目录的全路径
- 编辑系统变量path
- 新增值:%MAVEN_HOME%\bin
- 新建系统变量
- 我的电脑->属性->高级系统设置->环境变量
2.2 Maven本地仓库
-
用来存放下载到本地的jar包
-
默认存放路径为:c:\user\用户名.m2\repository
-
配置方法:修改conf目录下的settings.xml(3.6.1版本的路径,不同版本可能不一样)
-
<!-- 在settings标签下添加 --> <localRepository>D:\Maven\Repository</localRepository> <!-- 将本地仓库修改至D:\Maven\Repository目录下 -->
-
-
在cmd中更新maven本地仓库:
mvn help:system
- maven默认会从中央仓库中下载jar包到本地,但是默认的地址在国外,可能无法使用,因此需要配置镜像站
-
配置镜像仓库(阿里云)
-
<!-- 在settings标签下的mirrors标签下添加 --> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
-
2.3 在Eclipse下配置本地maven
- 选项栏中的Window->Preferences->Maven->Installations右边的Add添加Maven的目录,并✔选择它
- 在同Maven目录下的User Settings中的Global Settings和User Settings选择maven配置文件ssettings.xml
- 旧版可能不集成maven插件,需要自己下载
- [外链图片转存失败(img-wYSReeuG-1562678962396)(E:\学习资料\博客计划\1562661420182.png)]
- Group id:主id,一般写包名的前缀
- Artifact id:项目名
- version:版本
- packaging:jar——java项目、war——web项目
2.4 maven的项目结构
- -src
- –main
- —java ——存放项目的.java文件
- —resources ——存放项目资源文件,如spring、mybatis配置文件
- –test
- —java ——存放所有测试的.java文件
- —resources ——测试的资源文件
- –main
- -target ——目标文件输出位置,例如:class、.jar、.war文件
- -pom.xml ——maven项目的核心配置文件
2.5 maven的命令
mvn compile
- 完成编译操作,执行完毕后,会生成target目录,该目录下存放了编译后的字节码文件
mvn clean
- 执行完成后,会清除target目录
mvn test
- 完成测试操作,执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)
mvn package
- 完成打包操作,执行完毕后,会在target目录生成一个文件,该文件为jar或者war
mvn install
- 完成部署操作,执行完毕后,将打好的jar包安装到本地仓库,会在本地仓库中出现安装后的jar包,方便其他工程引用
- mvn组合命令
mvn clean compile
:清除后编译mvn clean test
:清除后测试mvn clean package
:清除后打包mvn clean install
:清除后部署
2.6 maven中引用另一个项目的操作
-
现在有一个maven的简单项目test1,再新建一个maven简单项目test2
-
如果要在test2项目中写个单元测试代码,调用test1的代码
-
只需要再test2中添加test1项目的依赖项
-
在pom.xml中添加项目所需要的jar包
-
<!-- 添加项目所需要的jar包,依赖 --> <dependcies> <!-- 一个依赖代表一个jar --> <dependency> <groupId>主Id</groupId> <artifactId>test1</artifactId> <version>test1的版本号</version> </dependency> </dependcies>
-
2.7 配置Maven插件
-
可以通过pom.xml配置插件来使用jdk1.8版本进行编译
-
compile插件
-
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
2.8 Maven创建Web项目
-
packaging选择war包
-
在webapp目录下,新建META-INF目录和WEB-INF目录。
-
在WEB-INF项目下,新建web.xml
-
在pom.xml下配置相关依赖包
-
2.8.1 配置tomcat插件来运行web项目
-
只配置启动配置:
- 默认情况直接配置tomcat:run的话是tomcat6,只支持jdk1.7。
-
增加tomcat插件:
- 在pom.xml配置tomcat7插件,然后运行配置中的goals为tomcat7:run
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <!-- 端口号 --> <port>8888</port> <!-- 访问路径 --> <path>/项目名</path> </configuration> </plugin> </plugins> </build>
-
本地tomcat运行:通过配置cargo插件来让maven使用本地的tomcat(极少使用)
- 运行配置中的goals为cargo:start,在start之前需要先install
<plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.2.4</version> <configuration> <container> <containerId>tomcat7x</containerId> <home>在本地的tomcat全路径</home> </container> <configuration> <type>existing</type> <home>在本地的tomcat全路径</home> <properties> <cargo.servlet.port>8888</cargo.servlet.port> </properties> </configuration> </configuration> </plugin>
-
-
2.8.2 直接使用eclipse中配置的本地tomcat来运行
- run as->run on server即可
2.9 Maven的继承
-
继承是为了消除重复,可以把很多相同的配置提取出来。例如:grouptld,version等
-
2.9.1 创建父项目
- 父项目的 packaging 必须为 pom
- 在父项目配置的依赖,子项目可以继承使用
- 父项目下只配置pom.xml让子项目来继承,一般情况下,不需要额外写代码
- 父项目下统一管理依赖和版本号
-
2.9.2 创建子项目
- 在创建子项目的时候,需要配置好要使用的父项目的Group Id、Artifact Id和Version
- 配置完后,在父项目添加的依赖,子项目可以直接继承使用
-
2.9.3 父项目的版本号提取
-
由于当父工程中定义的jar包越来越多,修改麻烦,因此把版本号提取成一个属性集中管理。
-
在父工程的pom.xml中配置一个properties标签,里面的标签自己自定义即可
<!-- 统一配置依赖版本号 --> <properties> <junit.version>4.10</junit.version> <!-- 在dependency中的version下用${junit.version}来使用版本号 --> </properties>
-
2.10 聚合
-
聚合一般是一个工程拆分成多个模块开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程。
-
例如电商项目中,包括商品模块、订单模块、用户模块等。就可以对不同的模块单独创建工程,最终在打包时,将不同的模块聚合到一起。
-
例如同一个项目中的表现层、业务层、持久层,也可以分层创建不同的工程,最后打包运行时,再聚合到一起。
-
2.10.1 创建聚合项目
- 创建聚合项目时,聚合项目的packaging 一定要使用pom,Groupld和ArtifacelD根据项目来写。
- 如果子模块要使用到共同的依赖包,直接在该项目下添加dependency
- 使用该项目进行install打包,会将各个模块按顺序进行打包
-
2.10.2 创建model模块(POJO)
- 记录该模块的dependency
-
2.10.2 创建Dao模块(数据访问层)
- 在eclipse下,创建模块时,要使用Maven Module,注意Parent Project要选择先前创建的聚合项目
- packaging为jar
- 添加model模块的dependency后,可以使用model模块中的类了
- 记录该模块的dependency
-
2.10.3 创建Service模块(业务处理层)
- 在eclipse下,创建模块时,要使用Maven Module,注意Parent Project要选择先前创建的聚合项目
- packaging为jar
- 添加model模块、Dao模块的dependency,就可以使用他的类与方法了
-
2.10.4 创建Web模块
- 在eclipse下,创建模块时,要使用Maven Module,注意Parent Project要选择先前创建的聚合项目
- 注意,packaging此时为war
- 添加Model模块、Dao模块、service模块的dependency
-
2.10.6 运行聚合项目
- 在Web模块中的pom.xml中配置tomcat插件(前前文),然后配置run configurations的tomcat7:run
-
2.10.9 发布聚合项目
- 由于Web模块使用到了全部代码,有了所有模块的jar包,因此将Web模块下的war包丢入服务器即可
三、Maven的核心概念
3.1 坐标
- 在maven中,坐标就是为了定位一个唯一确定的jar包
- Maven坐标的组成(GAV)
- groupid:定义当前maven组织名称
- artifactid:定义实际项目名称
- version:定义当前项目的当前版本
3.2 坐标的查找
- 使用maven仓库
3.3 依赖管理
依赖范围(Scope) | 对于主代码classpath有效 | 对于测试代码classpath有效 | 被打包,对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | - | Y | JDBC Driver Implementation |
-
其中依赖范围用来控制依赖和编译,测试,运行的classpath的关系,主要的是三种依赖关系如下:
- compile:默认编译依赖范围。对于编译,测试,运行三种classpath都有效。
- test:测试依赖范围。只对于测试classpath有效。
- provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为容器已经提供,例如servlet-api
- runtime:运行时提供。例如jdbc驱动
-
3.3.2 依赖传递
- 直接依赖和间接依赖
- 例如 test2 依赖 test1,test3 依赖 test2。其中test2直接依赖test1,test3间接依赖test1
- 当第二依赖的范围时compile的时候,依赖可以传递
- 当第二直接依赖的范围时test的时候,依赖不会得到传递
- 直接依赖和间接依赖
-
3.3.3 依赖冲突
- 假如 test1 使用 junit4.10依赖,并且scope为compile,那么test2、test3都可以使用test1的junit4.10,依赖传递下去了
- 假如test2 使用junit4.9依赖,那么test3就会使用就近的一个依赖,也就是junit4.9
-
3.3.4 可选依赖
- dependency标签下的
<optional>true/false</optional>
表示是否可选,可以理解程是否向下传递- true:可选,不向下传递
- false:默认值,不可选,向下传递
- dependency标签下的
-
3.3.5 排除依赖
-
exclusions可用于排除依赖。它写在
<dependency>
标签下<dependcies> <dependency> <groupId>主Id</groupId> <artifactId>test2</artifactId> <version>test1的版本号</version> <!-- 排除test2中的test1依赖 --> <exclusions> <exclusion> <groupId>主id</groupId> <artifactId>test1</artifactId> </exclusion> </exclusions> </dependency> </dependcies>
-
3.4 Maven的声明周期(稍微了解即可)
-
Maven生命周期就是为了对所有的构建过程进行抽象和统一。
-
包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。
-
生命周期可以理解为构建工程的步骤。
-
在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
- Clean Lifecycle:在进行真正的构建之前进行一些清理工作。
- Default Lifecycle:构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle:生成项目报告,站点,发布站点。
-
3.4.1 Clean生命周期:清理项目
- Clean 生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean移除所有上一次构建生成的文件
- post-clean执行一些需要在clean之后立刻完成的工作
- mvn clean等同于 mvn pre-clean clean
- 如果我们运行mvn post-clean,那么pre-clean,clean都会被运行。
- 这是Maven很重要的一个规则,可以大大简化命令行的输入。
- Clean 生命周期一共包含了三个阶段:
-
3.4.2 Default生命周期:构造项目
-
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。
-
validate generate-sources process-sources generate-resources process-resources 复制并处理资源文件,至目标目录,准备打包。 compile 编译项目的源代码。 process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources 复制并处理资源文件,至目标测试目录。 test-compile 编译测试源代码。 process-test-classes test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 prepare-package package 接受编译好的代码,打包成可发布的格式,如JAR。 pre-integration-test integration-test post-integration-test verify install 将包安装至本地仓库,以让其它项目依赖。 deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
-
运行任何一个阶段的时候,它前面的所有阶段都会被运行
-
因此运行mvn install的时候,代码会被编译,测试,打包,安装到本地仓库
-
此外,Maven的插件机制是完全依赖Maven的生命周期的。
-
-
3.4.3 Sit生命周期:生成项目站点
-
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能
-
pre-site 执行一些需要在生成站点文档之前完成的工作 site 生成项目的站点文档 post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 site-deploy 将生成的站点文档部署到特定的服务器上
-