Maven2

一、使用tomcat7-maven-plugin运行web项目

在pom.xml中添加配置信息




org.apache.tomcat.maven
tomcat7-maven-plugin
2.2


8080

/mvnweb




在Maven窗口中选择tomcat7插件,利用其中的tomcat7:run来启动服务器。
Maven授课笔记2 - 图1

二、生命周期

Maven有三套相互独立的生命周期,分别是:
①Clean Lifecycle在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
③Site Lifecycle生成项目报告,站点,发布站点。

前面三个生命周期彼此是独立的。
在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。(本节记住这句话就行了,其他的都不需要记)
但是注意:执行install命令时,会执行default生命周期的前面的所有阶段。但是不会执行clean阶段,因为不是一套生命周期。
Maven之所以这么设计其实就是为了提高构建过程的自动化程度:让使用者只关心最终要干的即可,过程中的各个环节是自动执行的。

三、插件

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件(plugin)完成的。
每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。
每个插件都能实现多个功能,每个功能就是一个插件目标。
我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。clean 的具体操作就是由 maven-clean-plugin 来实现的。
所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成

Maven插件列表的官网页面:http://maven.apache.org/plugins/
Maven插件的下载位置:本地仓库\org\apache\maven\plugins
可以将该目录下所有的插件全部删掉,然后依次执行各个命令,可以清楚的看到从Maven远程仓库下载对应插件的过程

四、依赖及其范围


可以对各种依赖范围使用表格总结如下:

依赖范围 编译(main) 测试(test) 运行 示例
compile log4j
provided × servlet-api lombok
test × × junit
runtime × JDBC驱动类
system ×
import × × ×

五、依赖传递

如何建立两个项目之间的依赖关系:moduleB依赖于moduleC

| <dependencies>
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03_moduleC</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies> | | —- |


C的资源,B可以使用哪些
Maven授课笔记2 - 图2

六、依赖冲突

路径最短者优先
路径相同时先声明者优先

七、依赖排除

| <dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03_moduleB</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> | | —- |


排除jar时,不需要写version。

八、统一管理依赖版本

| <properties> <spring-version>5.2.5.RELEASE</spring-version> <moduleB-version>1.0-SNAPSHOT</moduleB-version> <moduleD-version>1.0-SNAPSHOT</moduleD-version> </properties> | | —- |


统一的管理依赖的版本,便于对版本的修改。

九、继承

问题:有了依赖,为什么还要有继承
因为:依赖,只能使用compile的依赖,test、provided无法使用。

继承:
1. 父项目必须是pom类型
2. 父项目本身不提供新的源码功能,src目录可以删除
3. 子项目可以从父项目中继承test、compile、provided依赖
4. 父项目建议发布到本地库
5. 缺点:父项目子项目是父子关系,但是在其实是并列的项目,需要分别构建。



问题:父项目的全部资源会自动的被子项目继承。但是不同的子项目可能只需要其中的一部分。怎么办:
解决:dependencyManagement

父项目:

| <dependencyManagement> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> </dependencyManagement> | | —- |


子项目:需要就引入,不引人就无法使用;如果版本一致,引入是省略版本号。
好处:便于以后的版本修改,只要修改父项目的版本即可。

| <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.9</version> </dependency> </dependencies> | | —- |


十、聚合

问题1:有了继承,为什么还需要聚合

父项目子项目是父子关系,但是在其实是并列的项目,需要分别构建。

聚合关系是指多个项目共同组成一个项目。 用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目。对外看起来是一个项目。

对父项目进行构建,会自动的对所有的子项目构建。

聚合关系首先是一种继承关系。

父项目:

| <groupId>com.atguigu.maven</groupId> <artifactId>pro05_shopping</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
<modules> <module>order</module>
<module>product</module>
<module>payment</module> </modules> | | —- |


子项目:

| <parent>
<artifactId>pro05_shopping</artifactId>
<groupId>com.atguigu.maven</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order</artifactId> | | —- |


子项目的坐标可以省略groupid和version

十一、解决jar下载问题