maven的核心概念:
- 目录结构
- 常用maven命令
- 坐标:GAV
- 依赖
- 仓库
- 生命周期
- 继承
- 聚合
- 在Eclipse中使用Maven
1-目录结构
1.根目录:工程名
2.src目录:源码
3.pom.xml文件:Maven工程的核心配置文件
4.main目录:存放主程序
5.test目录:存放测试程序
6.Java目录:存放Java源文件
7.resources目录:存放框架或其他工具的配置文件
8.target目录:编译结果
2-常用maven命令
1、mvn clean:清理
2、mvn compile:编译主程序
3、mvn test-compile:编译测试程序
4、mvn test:测试
5、mvn package:打包
6、mvn install:把工程打包进入maven仓库中
7、mvn site:生成站点
8、mvn deploy:将最终的包复制到远程仓库
3-坐标
1-maven坐标:使用三个向量在仓库中唯一定位一个maven工程
1.groupid:公司或组织域名倒序+(项目名)
2.artifactid:模块名
3.version:版本
2-maven工程坐标与仓库中路径的对应关系
4-依赖
1-Maven解析依赖信息时会到本地仓库中查找被依赖的包
对于我们自己开发的maven工程,使用mvn install命令安装后就可以进入仓库
2-依赖的范围:
1.compile范围的依赖
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:参与
是否参与部署:参与--spring-core
2.test范围的依赖
对主程序是否有效:无效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与--junit
3.provided范围的依赖
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与--servlet-api.jar
3-依赖的传递性:
1.直接依赖:maven项目中pom.xml导入的依赖
2.传递过来的依赖:maven项目中导入其他maven项目时,所传递过来的依赖
3.好处:
可以传递的依赖可以不用在每个模块工程中都重复声明,,在最下面的工程中依赖一次即可
4.非compile范围的依赖不能传递,所以在各个工程模块中,如果有需要就得重复声明依赖
4-依赖的排除:
1.<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
2.如果在最下面的工程中排除,也会传递排除
5.依赖的原则:
1.作用:解决模块工程之间的jar包冲突
2.验证路径最短者优先原则。
3.验证路径相同,先声明者(<dependency>标签的声明顺序)优先
即依赖的工程在POM.xml中的先后顺序
4.多次直引不同版本的jar时,使用最后声明的版本
6.同一管理依赖的版本
1.如果同一升级版本
2.<properties>
<atguigu.spring.version>4.0.0.RELEASE</atguigu.spring.version>
</properties>
<version>${atguigu.spring.version}</version>
3.凡是需要统一声明后再引用的场合都可以使用
5-仓库
仓库的分类:
1-本地仓库:当前电脑上部署的仓库目录
2-远程仓库:
私服:搭建在局域网上
中央仓库:架设在Internet上
中央仓库镜像:为分担中央仓库流量,提高访问速度
3-仓库中保存的内容:
1.maven自身需要的插件
2.第三方框架或工具的jar包
3.我们自己开发的maven工程
6-生命周期
1-各个构建环节的执行顺序:不能打乱,必须按照既定的正确顺序执行
2-maven的核心程序中定义了抽象的生命周期,生命周期中的各个阶段的具体任务是由插件来实现的
3-三个独立的生命周期:
Clean LifeCycle:清理工作
Default LifeCycle:构建的核心部分:编译,测试,打包,安装,部署
Site LifeCycle:生成项目报告,站点,发布站点
4-maven的核心程序为了更好的实现的自动化构建,按照这一特点执行生命周期中的各个阶段:
不论执行生命周期的那个阶段,都是从这个生命周期的初始位置开始执行。
5-插件和目标
1.Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
2.每个插件都能实现多个功能,每个功能就是一个插件目标。
3.Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
例如:compile就是插件maven-compiler-plugin的一个目标;pre-clean是插件maven-clean-plugin的一个目标。
7-继承
1.非compile范围的依赖无法被传递,易造成版本混乱
2.将非compile范围的依赖提取到父工程中,而再子工程中不声明依赖版本,,以父工程中的依赖为准
3.操作步骤:
1、创建一个父工程:打包方式为Pom
2、再子工程中声明对父工程的引用
<!-- 子工程中声明父工程 -->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--以当前文件为基准的父工程pom.xml文件的相对路径 -->
<relativePath>../Parent/pom.xml</relativePath>
</parent>
3、将子工程中和父工程中坐标重复的内容删除
<groupId>com.atguigu.maven</groupId>
<version>0.0.1-SNAPSHOT</version>
4、在父工程中同一依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
5、删除子工程的依赖版本号
<version>3.4.6</version>
4.注意:配置继承后,执行安装命令时,要先安装父工程
8-聚合
1-一键安装各个模块工程
2-在一个总的聚合模块中去配置各个参与的模块
<!--配置聚合 -->
<modules>
<!--指定各个子工程的相对路径 -->
<module>../HelloFriends</module>
<module>../MakeFriends</module>
</modules>
3-在配置的工程pom.xml中运行
4-那么工程拆分后又如何进行互相调用和访问呢?这就需要用到 Maven 的依赖管理机制。
9-在Eclipse中使用Maven
1)Maven插件中的设置
1-installations:指定Maven核心程序的位置:maven安装版本地址
2-User Settings:指定conf/settings.xml文件的位置,进而获取本地仓库的位置
2)基本操作
1-maven项目导入:
import--Maven--Existing Maven Projects
是依据pom.xml文件识别
3)创建maven问题
1-pom.xml错误问题:缺少web.xml文件
解决:
1.在pom.xml中设置
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
2.新增web.xml:Java EE Tools-->Generate Deployment Descriptor Stub
3.项目右键--Properties--Maven--Project Facets--Dynamic Web Moudule
/src/main/webapp
2-在webapp文件处新增.jsp文件,会报错
解决:1.可通过构建路径--Add Library--Server Runtime--添加tomcat服务
2.在pom.xml文件中添加
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
3、遇到NullPointerException时,且在(index).jsp._jspInit异常,有可能是pom.xml的jsp-api
<scope>provided</scope>范围出错!