1.maven常用的构建命令
(1)mvn -v 查看maven版本
(2)compile 编译
(3)test 测试
(4)package 打包
(5)clean 删除target
(6)install 安装jar包到本地仓库中
2.maven自动建立目录骨架
(1)archetype插件
- 用于创建符合maven规定的目录骨架
- 先创建一个文件夹,其名为project名
(2)自动创建目录方式一
- win+R,cmd,cd到该文件夹路径下,输入mvn archetype:generate,enter,第一次会自动下载一些相关依赖
- enter,输入6
- 'groupId' 输入com.gc.maven;
- 'artifactId'输入maven-service;
- 'version'输入1.0.0SNAPSHOT;
- 'package'输入com.gc.maven.service,
- enter,输入y
- 至此自动创建成功
- 这是按照提示进行选择的方法
(3)自动创建目录方式二
- win+R,cmd,cd到该文件夹路径下
- 输入mvn archetype:generate -DgroupId=组织名,公司网址的反写+项目名 -DartifactId=项目名-模块名 -Dversion=版本号 -Dpackage=代码所存在的包名
3.maven中的坐标和仓库
(1)坐标
- 构件通过坐标作为其唯一标识
- groupId,artifactId,version组成项目的基本坐标
(2)仓库
- 仓库管理项目的依赖
- 本地仓库和远程仓库:打开maven—>lib—>maven-model-builder-3.5.4.jar,用360压缩打开,org—>apache—>maven—>model—>pom-4.0.0.xml,打开,找到<url>https://repo.maven.apache.org/maven2</url>,即为远程仓库
- 镜像仓库:打开maven—>conf—>settings.xml,找到mirrors,配置1-2个镜像
<mirror> <id>jboss-public-repository-group</id> <mirrorOf>central</mirrorOf> <name>JBoss Public Repository Group</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
- 更改仓库位置:默认本地仓库在c盘中C:\Users\guochan\.m2,如果重装系统可能丢失,所以要更改仓库位置
- 创建一个本地文件夹其路径为E:\maven-3.5.0\repository,打开maven—>conf—>settings.xml,找到localRepository,
- <localRepository>E:/maven-3.5.0/repository</localRepository>
- win+R cmd ,输入命令mvn compile测试是否成功
4.在Intellij IDEA中配置maven以及创建maven项目
(1)配置maven
- Ctrl+Shift+A,输入maven,选择maven settings
- 在maven home directory中选择maven文件夹目录,我这里是D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
- 在user setting file中选择override,填入修改好本地仓库位置的配置文件,我这里是D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
- local repository会自动检测到修改过的本地仓库路径
- 在settings搜索框中输入runner,找到maven下的runner,在VM Options中输入-DarchetypeCatalog=internal,如果未配置会导致maven 骨架生成速度缓慢
- File—>other settings—>default settings,再将刚才配置一遍,在创建maven项目的时候就不用重复配置了
- 如果没有安装tomcat,到http://tomcat.apache.org/中download core下的zip直接解压即可,点击安装目录bin/startup.bat启动服务
(2)创建maven web项目
1)新建maven项目
- File—>New—>Project,选择maven,在create from archetype打勾,选择
,next
- 输入groupId和artifactId,next
- 仍然选择maven home directory为D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
- user setting file选择override,为D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
- local repository会自动检测到修改过的本地仓库路径
- 上述加下划线的三步如果在default settings中配置过即可忽略
- 点绿色的+,Name中输入archetypeCatalog,Value中输入internal,OK(该属性设置可以加快项目创建速度),next,finish
- 如果创建maven项目失败,错误[ERROR] Maven execution terminated abnormally (exit code 1)
- 原因:如果path里有两个java环境,则会导致创建失败
- 解决办法:查看Path路径下发现有C:\ProgramData\Oracle\Java\javapath和%JAVA_HOME%\bin这两个java环境,删除C:\ProgramData\Oracle\Java\javapath即可正常创建
2)手动添加缺失文件夹
- 创建好的项目结构缺少一些文件夹,手动补全,Alt+Insert,按照上一篇的目录结构添加directory,在main下添加java和resources,在src下添加test和resources
- Ctrl+;调出Project Structure,点击Modules,main下的java选择Sources,main下resources选择Resources;test下的java选择Tests,test下的resources选择Test Resources
3)部署tomcat
- Run—>Edit Configurations(Ctrl+Shift+J),点绿色+,34 items more,找到Tomcat Server—>Local
- 在Name中输入Tomcat名称
- 在Server选项卡中: Application server选择本机Tomcat安装路径
- 在Deploment选项卡中: 点绿色+,选择Artifacts,选择 项目:war exploded,在Application context中填入/项目名/index.jsp
- 切回Server选项卡中: On 'Update' action选择Update classes and resources;On frame deactivation选择Update classes and resources;OK
- 点击Run或者Debug,浏览器自动跳转出http://localhost:8080/项目名/index.jsp/,完成
5.maven的生命周期和插件
(1)完整项目的构建过程
- 清理、编译、测试、打包、集成测试、验证、部署
(2)maven生命周期
- clean 清理项目
- pre-clean 执行清理前的工作
- clean 清理上一次构建生成的所有文件
- post-clean 执行清理后的文件
- default 构建项目(最核心)
- compile
- test
- package
- install
- site 生成项目站点
- pre-site 在生成项目站点前要完成的工作
- site 生成项目的站点文档
- post-site 在生成项目站点后要完成的工作
- site-deploy 发布生成的站点到服务器上
(3)maven的插件
- 详细插件信息可查看http://maven.apache.org/plugins/index
- 下面以使用source插件为例,希望运行package时即可将源码打包,在pom.xml中写入
<build> <plugins> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.4.0</version> <executions> <execution> <phase>package</phase> <goals>jar-no-fork</goals> </execution> </executions> </plugin> </plugins> </build>
- 其中goals可以从上述网站中查看
6.maven中pom.xml解析
- 小技巧:在写pom.xml时可以参考http://mvnrepository.com/
<?xml version="1.0" encoding="UTF-8"?> <!--project是pom.xml的根元素,包含pom约束的信息--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--指定当前pom的版本,也是必不可少的元素--> <modelVersion>4.0.0</modelVersion> <groupId>反写的公司网址+项目名</groupId> <artifactId>项目名+模块名</artifactId> <!--第一个0表示大版本号 第二个0表示分支版本号 第三个0表示小版本号 0.0.1 snapshot 快照 alpha 内部测试 beta 公测 Release 稳定 GA 正式发布 --> <version>1.0-SNAPSHOT</version> <!--jar war zip pom--> <packaging>war</packaging> <name>项目描述名</name> <url>项目地址</url> <description>项目描述</description> <developers>开发人员列表</developers> <licenses>开源框架许可证信息</licenses> <organization>组织信息</organization> <!--依赖列表--> <dependencies> <!--依赖项--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <type></type> <!--依赖范围 test表示junit只在测试的依赖范围内有用,在main主代码中引用junit会报错--> <scope>test</scope> <!--设置依赖是否可选,有true和false,默认是false,子项目继承,若为true,子项目必须显示引入该依赖--> <optional>false</optional> <!--排除依赖传递列表--> <exclusions> <exclusion> </exclusion> </exclusions> </dependency> </dependencies> <!--依赖的管理,主要定义在父模块中,供子模块继承--> <dependencyManagement> <!--依赖列表--> <dependencies> <!--多个依赖,但这些依赖并不会被运行,不会被引入实际的依赖中--> <dependency> </dependency> </dependencies> </dependencyManagement> <!--对构件行为提供相应的支持--> <build> <!--插件列表--> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> </plugin> </plugins> <!--通常用于子模块对父模块pom的继承--> <parent></parent> <!--用来聚合运行多个maven项目,使很多maven模块一起编译--> <modules> <module></module> </modules> </build> </project>
7.maven依赖范围
(1)<scope>
- maven的依赖范围
- 开发时使用某一框架,将该项目的jar包引入到项目的classpath路径中,项目即可使用该框架为我们封装好的一些方法
- 依赖范围就是控制依赖与classpath的关系
(2)maven中的classpath
- 编译
- 测试:例如junit依赖范围中的值test表明junit只存在于测试的classpath中
- 运行
(3)scope的值
- 打开http://maven.apache.org/,点击右侧栏中的Documentation-Index(category),点开Introductions-The Dependency Mechanism(依赖机制),找到Dependency Scope
- 有6种scope的值,介绍如下
- compile:默认的范围,在编译、测试、运行时都有效。
- provided:在编译、测试时有效。例子:Servlet API加载,运行时不会被加入,因为web容器已经包含了这些API,如果加入进去会导致冲突。
- runtime:在测试、运行时有效。例子:jdbc驱动的实现,项目主代码的编译只需要JDK提供的jdbc的API,只有在执行测试和运行项目的时候才需要实现接口的具体的jdbc驱动。
- test:只在测试时有效。例子:junit。
- system:与provided相同,在编译,测试时有效,与本机系统相关联,可移植性差,换机子以后可能会出问题。比如我们要引用本机的JAVA_HOME,如果把项目移植到其他系统上,可能由于路径的不一致而导致错误。
- import:导入的依赖范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency配置(是从其他pom中继承的依赖)。
8.maven依赖传递
(1)依赖传递的例子
- 假设A依赖于B,B依赖于C
- 首先在B的pom.xml中添加B对C的依赖
<dependency> <groupId>com.gc.C</groupId> <artifactId>C</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
- 再在A的pom.xml中添加A对B的依赖
<dependency> <groupId>com.gc.B</groupId> <artifactId>B</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
- 然后对C clean package(生成C的jar包) install(C的jar包安装到本地仓库中);再对B clean package(生成B的jar包) install(B的jar包安装到本地仓库中)
- 对A clean compile,即会发现在A的Maven Dependencies中有B.jar和C.jar。在A的pom.xml中并没有配置C,所以这就是传递依赖
(2)排除依赖
- 若A只想依赖于B,不想依赖于C,则可在A的pom.xml中加入exclusion,这样A中Maven Dependencies就自动去除了C.jar
<dependency> <groupId>com.gc.B</groupId> <artifactId>B</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.gc.C</groupId> <artifactId>C</artifactId> </exclusion> </exclusions> </dependency>
9.maven依赖冲突
(1)产生依赖冲突的场景
- A和B依赖了不同版本的相同的构件,那么对依赖A、B的C来说依赖的是哪个版本的构件,这就产生了依赖冲突
(2)两条原则
- 短路优先
- A—>B—>C—>X(jar)
- A—>D—>X(jar),选择此依赖
- 先声明先优先
- 如果路径长度相同,则谁先声明,先解析谁
10.maven聚合和继承
(1)使用聚合的场景:
- maven中将多个项目install,将其安装到本地仓库中,聚合可以将他们放到一起运行,称为聚合
(2)聚合的例子:
- 想要将项目A,B,C一起install到本地仓库中
- 新建一个新的maven项目D,其pom.xml如下
<packaging>pom</packaging> <modules> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
- 对D的pom.xml clean install,即可将A,B,C生产jar包并安装到本地仓库中
- D的pom.xml作为其他项目pom的容器
(3)使用继承的场景:
- 很多项目的pom.xml中有很多重复的配置,例如junit等,可以利用继承减少配置
(4)继承的例子:
- 假设有parent项目和sub项目,则分别配置parent和sub的pom.xml
- 新建一个新的maven项目parent,其pom.xml如下
<packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.11</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
- 在sub项目中的pom.xml修改如下(将junit中的version和scope删除):
<parent> <groupId>com.gc.parent</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
- 此时junit就可以从parent的pom中继承过来