maven系列1-maven的使用
Table of Contents
1 maven概念
1.1 作用(便利)
- 管理jar包
- 增加第三方jar
- 管理jar包之间的依赖关系(自动关联下载所有依赖的Jar,并且不会冲突)
- 将项目拆分成若干个模块
编译-打包-部署-测试 –>自动化测试
1.2 概念
maven是一个基于java的自动化构建工具
自动化构建工具maven:将原材料(java、js、css、html、图片等)–>产品(可发布的项目)
1.2.1 构建工具发展历史
make-ant-ivy-maven-gradle
1.2.2 maven操作
日常写代码的流程:写Java代码->执行; IDE起的作用:java->class->执行;
maven至少能完成的工作
- 清理:删除编译的结果,为重新编译作准备
- 编译:Java->class
- 测试:针对项目中的关键点进行测试,也可以用项目中的测试代码去测试开发代码
- 报告:将测试的结果进行显示
- 打包:将项目中包含的多个文件压缩成一个文件,用于安装或部署
- 安装:将打成的包放到 本地仓库
- 部署:将打成的包放到 服务器 上准备运行
2 maven安装配置
2.1 下载、安装、配置环境
配置环境,可使用软连接
2.2 配置本地仓库
maven目录/conf/settings.xml
2.3 约定优于配置
maven约定的目录结构:
模块名 --src --main :程序功能代码 --java :java文件 --resources :资源文件,配置文件 --test :测试代码 --java --resources --pom.xml :项目对象模型
坐标gav
<!--域名反转.大项目名--> <groupId>com.newgrand</groupId> <!--子模块名--> <artifactId>helloworld</artifactId> <!--版本号--> <version>0.0.1-SNAPSHOT</version>
仓库概念
3 maven常用命令
执行mvn: 必须在pom.xml所在目录执行
3.1 常见命令
首次执行是会下载基础组件
- mvn compile –只编译main目录中的Java文件
- mvn test –测试
- mvn package –jar/war
- mvn install –将开发的模块,放入本地仓库,供其他相关模块使用(放入的位置,是通过gav坐标决定)
- mvn clean –删除target目录(编译产生的文件)
在ide中使用maven
- 配置maven版本
- 配置本地仓库 -修改settings.xml
4 maven生命周期
4.1 生命周期
4.1.1 package
- resources
- compile
- test
- building Jar
4.1.2 生命周期阶段
- clean lifecycle: 清理
- default lifecycle: 默认
- site lifecycle: 站点
5 Maven依赖、依赖排除、依赖有效性、通过maven整合多个项目
maven在编译、测试、运行项目时,各使用一套classpath
执行 | compile | test | provided |
---|---|---|---|
主程序 | ✔ | ✖ | ✔ |
测试程序 | ✔ | ✔ | ✔ |
部署 | ✔ | ✖ | ✖ |
5.1 依赖的范围、依赖的有效性
依赖范围scope: compile(默认)、test、provided
5.2 依赖排除
<exclusions> <exclusion> <groupId>xx</groupId> <artifactId>yy<artifactId> </exclusion> </exclusions>
5.3 依赖的传递性
A.jar–> B.jar–>C.jar
要使A.jar ->C.jar :一般来说仅当B.jar依赖于C.jar的范围是compile
多个maven项目(模块)之间如何依赖; P项目->q项目
- p项目 install到本地仓库
- q项目依赖:
<dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <scope>compile</scope> </dependency>
6 依赖的传递性、依赖原则、统一版本、统一编码
6.1 依赖原则
- 路径最短原则
- 路径长度相同:
- 在同一个pom.xml声明两个相同的依赖,后面的生效(覆盖)(不建议)
- 如果是不同的pom.xml中有2个相同的依赖时,先声明的生效(首先)
6.2 统一版本、统一编码
building path: 删除旧的,增加新的
pom.xml
- 配置properties节点及其子节点
- 配置build>plugins>plugin节点及其子节点
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> ${}
7 继承、聚合
7.1 打包方式
- Java项目打包成jar
- web项目打包成war
- 父工程打包成pom
7.2 继承
方便版本的管理,子工程可以通过父工程,统一管理依赖的版本
7.2.1 继承实现方式
- 建立父工程
父工程的打包方式为pom
- 在父工程中编写依赖
<dependencyManagement> <dependencies> <dependency> gav <dependency> </dependencies> </dependencymanagement>
- 子类继承父工程
- 加入父工程坐标
- 当前工程的pom.xml到父工程pom.xml的相对路径
<!--父pom--> <parent> <groupId>x</groupId> <artifactId>y</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../xx/pom.xml</realativePath> </parent>
- 子类声明使用的依赖
声明需要引用的父类依赖
7.3 聚合
maven 将一个大工程拆分成 若干个子工程(模块)
聚合可以将拆分的多个子工程合起来
maven项目能够识别的:自身包含的、本地仓库中的
前置工程的install操作可以通过“中搞定”
7.3.1 聚合的使用
<modules> <module>paycenter-facade</module><!--client层用于定义自身服务的对外服务(接口)需要打成jar,提供给消费方--> <module>paycenter-common</module><!--common层一般将service,dal,facade三层之间对象转换时用的model,以及从各层抽取出的公用代码--> <!--<module>demo-dal</module><!–dal层负责和数据库交互映射,外部服务包装–>--> <module>paycenter-service</module><!--service层负责应用业务逻辑,依赖dal,实现facade层定义业务接口--> </modules>
聚合只能配置在打包方式为pom的工程中,以后只要操作总工程
module的顺序无所谓
mvn clean : 删除target文件
8 maven创建、部署web工程
8.1 手动
- 打成war包
- 放到tomcat
8.2 通过mvn执行部署运行web项目
bulid->cargo
<build> <!-- finalName:表示部署的项目名称,即war包名称也可以不声明 --> <finalName>WebProject</finalName> <plugins> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.6.0</version> <configuration> <!-- 指定Web容器的名称和路径 --> <!--【1】containerId表示容器的类型 --> <!--【2】home表示容器的安装目录,--> <!--【3】type可以不声明,取默认值installed; --> <container> <containerId>tomcat7x</containerId> <home>D:\JAVA\apache-tomcat-7.0.70</home> </container> <!-- 配置信息:用于配置部署的模式及复制容器配置到什么位置 --> <!--【1】type:部署模式,有三种值【standalone,existing,runtime】--> <!-- standalone:将指定的web容器配置信息复制到指定路径,并将部署应用到指定路径;--> <!-- existing:将应用部署到现有的web容器中,不需要重新复制容器的配置信息 --> <!-- runtime:既不使用独立的容器配置,也不使用本地现有的容器配置,而是依赖一个已运行的容器。--> <!--【2】home:指定路径,部署应用的路径 --> <configuration> <type>standalone</type> <home>${project.bulid.directory}/tomcat7x</home> </configuration> </configuration> </plugin> </plugins> </build>