Maven学习
==自动化构建工具Maven==
==构建==:
以我们编写的Java代码、框架配置文件、国际化等其他资源文件、JSP页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
- 编译:Java源文件[User.java]—>Class字节码文件[User.class]—>交给JVM去执行。
- 部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程”编译的结果“,编译结果==拿==到服务器上的指定目录下叫部署。
- 搭建
构建过程中的各个环节
- 清理:将以前编译得到的旧的Class字节码文件删除,为下一次编译做准备
- 编译:将Java源程序编程成Class字节码文件
- 测试:自动测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态Web工程打war包,Java工程打jar包
- 安装:Maven特定的概念——将打包得到的文件复制到”仓库“
- 部署:将动态web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行
安装Maven核心程序
百度网盘:(链接:https://pan.baidu.com/s/18dN676Wj9ri0a-kDfb_cEQ 提取码:w2xg 复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V2的分享)
echo %JAVA_HOME%
C:\Program Files\Java\jdk1.8.0_91
==Maven的核心概念==
- 约定的目录结构
- POM
- 坐标
- ==依赖==
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
第一个Maven工程
-
创建约定的目录结构(==自定义需配置 ||约定>配置>编码||==)
- 根目录:工程名
- src目录:源码
- pom.xml文件:Maven工程的核心配置文件
- main目录:存放主程序
- test目录:存放测试程序
- java目录:存放Java源文件
- resources目录:存放框架或其他工具的配置文件
-
常用Maven命令
- mvn clean:清理
- mvn compile:编译主程序
- mvn test-compile:编译测试程序
- mvn test:执行测试
- mvn package:打包
-
POM(Project Object Model:项目对象模型||DOM(Document Object Model:文档对象模型))
- 相当于动态Web工程中的web.xml;
-
坐标
-
使用下面三个向量在仓库中唯一定位一个Maven工程
-
groupid:公司或组织域名倒叙+项目名
<groupId>com.lql.Hello</groupId> -
artifactid:模块名
<artifactId></artifactId> -
version:版本
<version></version>
-
-
-
仓库
- 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务。
- 远程仓库
- 私服:搭建在局域网环境中,为局域网范围内的所有工程服务。
- 中央仓库:架设在Internet上,为全世界所有Maven工程服务。
- 中央仓库镜像:为了分担中央仓库的流量,提升用户访问速度。
-
依赖(初步)
-
Maven解析依赖信息时会到本地仓库中查找被依赖的jar包。
对于我们自己开发的Maven工程,使用mvn install命令安装后就可以进入仓库。
-
依赖的范围

-
compile范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:参与
- 是否参与部署:参与
- 典型例子:spring-core
-
test范围依赖
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:junit
-
provided范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
- 是否参与部署:不参与
- 典型例子:servelet-api.jar


-
-
-
生命周期
顺序执行,自动执行命令之前的命令,Default生命周期最重要
-
在Eclipse中使用Maven
- Maven插件:Eclipse内置
- Maven插件的设置
- Installations:指定Maven核心程序的位置,最好改成自己下的。
- User Settings:指定conf/settings.xml的位置,进而获取本地仓库的位置。(百度Maven在eclipse中的配置就行)
- 基本操作
- 创建Maven版的Java工程(==注意==勾选第一个:Create a simple project)
- 创建Maven版的Web工程(步骤较多,自行搜索)
- 执行Maven命令
-
依赖(高级)
-
依赖的传递性

- 好处:可以传递的依赖在“最下面”的工程中依赖一次即可。
- ==注意==:非compile范围的依赖不能传递。所以在各个工程模块有需要就得重复声明依赖。
-
依赖的排除
-
需要设置依赖排除的场合

-
依赖排除的设置方式
<exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions>
-
-
依赖的原则
-
作用:解决模块工程之间的jar包冲突问题
-
情景设定1:验证路径最短者优先原则

-
情景设定2:验证路径相同时先声明者优先(dependency标签的声明顺序)

-
-
统一管理依赖的版本
-
情景举例:很多jar包的依赖版本一致,如果要统一升级,手动逐一修改不可靠。
-
建议配置方式
-
使用properties标签内使用自定义表签统一声明版本号
<properties> <lql.spring.version>4.1.1.RELEASE</lql.spring.version> </properties> -
在需要统一版本的位置,使用${自定义标签}引用声明的版本号
<version>${lql.spring.version}</version> -
其实properties标签配合自定义标签声明数据的配置不只是用于版本号,==凡是==需要统一声明后再引用的场合都可以使用。
<properties> <lql.spring.version>4.1.1.RELEASE</lql.spring.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
-
-
-
-
继承
-
现状
Hello依赖的junit:4.0
HelloFriend依赖的junit:4.0
Make Friends依赖的junit:4.9
由于test范围的依赖不能传递,所以必然会分散再各个模块工程中,很容易造成版本不一致。
-
需求:统一管理各个模块工程中对junit依赖的版本
-
解决思路:将junit依赖统一提取到“父”工程中,在子工程中声明junit依赖时不指定版本,以父工程中统一设定的为准,同时也便于修改。
-
操作步骤
-
创建一个Maven工程作为父工程,==注意==:打包的方式pom
<groupId>com.lql.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> -
在子工程中声明对父工程的引用
<!-- 子工程中声明父工程 --> <parent> <groupId>com.lql.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 以当前文件为基准的父工程pom.xml文件的相对路径 --> <relativePath>../Parent/pom.xml</relativePath> </parent> -
将子工程的坐标中与父工程坐标中重复的内容删除

-
在父工程中统一junit的依赖
<!-- 配置依赖的管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> -
在子工程中删除junit依赖的版本号部分

-
==注意==:配置继承后,执行安装命令时要先安装父工程。
-
-
-
聚合
-
作用:一键安装各个模块工程
-
配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块
<!-- 配置聚合 --> <modules> <module>../Hello</module> <module>../HelloFriend</module> <module>../MakeFriends</module> </modules> -
使用方式:在聚合工程的pom.xml上点右键——》run as——》maven install
-