文章目录
什么是 maven
maven
是一种项目管理工具,帮助我们管理项目的结构,各种 jar
包,简化项目的构建;
不要与 Git
混淆,都是管理项目,但是一个是版本控制,一个是目录结构的控制 ;
环境的搭建
配置两个环境变量即可;
- 配置一个系统环境变量,名字随便取,值为下载的
maven
的文件夹路径 ; - 在 path 路径里面添加一个,
%上一步取的名字%in
;
常见命令的含义
-
mvn -v
查看maven
版本 -
mvn compile
编译编译会在目录下面生成一个
target
文件夹; -
mvn test
测试 -
mvn package
打包 -
mvn clean
删除 target -
mvn install
将项目打成jar
包,安装到仓库里面
自动生成 maven 的目录骨架
maven 官方要求的目录结构如下:
src
- mian
- java
- package
- test
- java
- package
resource
既然 maven
本身是管理项目结构的,那么它一定也有方法自己生成该目录结构 ;
archetype:generate
按照提示一步一步的写上模块名、版本号等等 ;archetype:generate
后面加参数
-DgroupId
=组织名,一般为公司网址反写+项目名 ;
-DartifactId
=模块名,一般为项目名+模块名
-Dversion
=版本号
-Dpackage
=包名,也就是代码所存放的包
使用上述命令的时候,第一次使用,需要去 中央仓库
下载一下文件,可能会因为网络问题报错;
No plugin found for prefix 'archetype' in the current project
and in the plugin groups [org.apache.maven.plugins,.......等等一堆报错
这就是因为网络问题,则打开 maven
的 setting
配置文件,设置代理 mirrors
;
<mirrors>
<!-- 设置代理。我这里不设置的话,网络会有问题 -->
<mirror>
<id>ibiblio.org</id>
<name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>
<mirrorOf>central</mirrorOf>
<!-- United States, North Carolina -->
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<!-- 上面的镜像是 United States, North Carolina 美国,北卡罗拉州的,我配置以后还是报错,可能距离太远了,下载总是等很久,以致于失败。-->
<!-- 换下面的代理,速度杠杠的 -->
<mirror>
<id>visionsoft</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2</url>
</mirror>
</mirrors>
成功以后出现如下画面(第一种方法演示):
让选择一个版本,我选了6(之前还让选择一个什么玩意,我选了1200):
Choose a number: 6: 6
Downloading: http://repo1.maven.org/maven2/org/apache/beam/beam-sdks-java-maven-archetypes-examples-java8/2.2.0/beam-sdks-java-maven-archetypes-examples-java8-2.2.0.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/beam/beam-sdks-java-maven-archetypes-examples-java8/2.2.0/beam-sdks-java-maven-archetypes-examples-java8-2.2.0.pom (5 KB at 4.5 KB/sec)
Downloading: http:......
让输入几个参数
Define value for property 'groupId': com.hyc.maven // 一般是公司网址反写+项目名
Define value for property 'artifactId': maven.model // 一般是项目名+模块名
Define value for property 'version' 1.0-SNAPSHOT: : 1.0.0 //版本号
Define value for property 'package' com.hyc.maven: : com.hyc //写java代码的包名
Confirm properties configuration:
groupId: com.hyc.maven
artifactId: maven.model
version: 1.0.0
package: com.hyc
Y: : y // 输入 y 代表yes
最后就会成功生成项目骨架 ;
maven 的坐标
比如 pom.xml
文件中的随便一个构件:
<dependencies>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-direct-java</artifactId>
<version>${beam.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
其中的
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-direct-java</artifactId>
<version>${beam.version}</version>
三句,就构成一个坐标 ;
maven 的仓库
maven 自己有一个全球的中央仓库,里面包含了绝大部分的开源项目 ;我们需要使用其中的 jar
包时候,只需要在 pom.xml
中写上对应的 jar
包的坐标即可,maven
就会去中央仓库下载,然后添加到本地的 maven
仓库 ;
镜像仓库
因为中央仓库在国外,访问的时候,有时候总归有问题;好在国内有中央仓库的镜像仓库;
如果不配置的话,maven
默认去 中央仓库 下载需要的东西 ;
这里我们可以配一下,也就是之前,我修改的 maven
的 setting
配置文件 ;
<mirror>
<id>visionsoft</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2</url>
</mirror>
id
是镜像仓库的名字 ;
mirrorOf
是为谁配置镜像仓库,这里是 central
,这个是中央仓库的名字,也可以使用通配符 *
,为所有的仓库都配这个镜像仓库 ;
修改本地 maven 仓库的位置
默认的本地仓库地址是在 C
盘下的 .m2
目录下面 ;
继续修改 maven
的 setting
配置文件 ;
找到 setting
里面下面有一个 localRepository
标签,更改其值,其值就是新仓库的地址 ;
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
修改为:(注意是 /
不是 )
<localRepository>E:/maven/myLocalRepo</localRepository>
maven 的生命周期和插件
定义了三套相互独立的生命周期:
clean
清理项目default
构建项目(最核心)site
根据pom.xml
文件中的信息生成项目站点 ;
三套生命相互独立 ;
每个生命周期内部,又有自己的阶段,执行其中的一个阶段,必定会 依次执行 该阶段之前的阶段 ;但是,各个生命周期内部的执行,不会触及到其他另外两套生命周期 ;
clean
清理项目 内部又分为三个阶段 ;
pre-clean
执行清理前的工作clean
清理上一次构建生成的所有文件post-clean
执行清理后的文件
clean
构建项目内部阶段 ;
compile
编译test
测试package
打包install
安装
site
生成站点项目内部阶段 ;
pre-site
在生成站点前要完成的工作site
生成项目站点post-site
在生成项目站点以后要完成的工作site-depoly
发生生成的站点到服务器上
maven 的 pom 的文件
<!-- 指定當前pom的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组别ID 一般都是 公司网址反写-项目名 -->
<groupId>com.hyc.maven</groupId>
<!-- 模块名,maven 是按照模块来的-->
<!-- 一般都是项目名-模块 -->
<artifactId>maven.model</artifactId>
<!-- 版本号 -->
<!-- 一般都是由三位数字构成 -->
<!-- 第一位:大版本 -->
<!-- 第二位:分之版本 -->
<!-- 第三位:小版本 -->
<!-- 小版本后面又跟着一些英文标识 1.0.1-GA -->
<!--
snapshot 快照版本
alpha 内部测试版本
beta 公测版本
Release 稳定版本
GA 正式发布版本
-->
<version>1.0.0</version>
<!-- maven 项目打包方式 -->
<!-- 不指定就是 jar -->
<packaging>jar</packaging>
<!-- 项目名 -->
<name></name>
<!-- 项目地址 -->
<url>/<url>
<!-- 项目描述 -->
<description></description>
<!-- 项目开发人员 -->
<developers></developers>
<!-- 隶属于何组织 -->
<orgnization></orgnization>
<!-- 依赖列表 -->
<dependencies>
<!-- 依赖 -->
<dependency>
<!-- 依赖所在位置,也就是坐标 -->
<groupId>/<groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<!-- 依赖的使用范围 -->
<!--
如果写上 test 则表示,仅在 测试代码的时候使用
-->
<scope>test</scope>
<!-- 设置是否可以可选,默认是false -->
<!--
如果为 false 则子项目默认继承该依赖
如果为 true ,子项目需要使用,就需要显示的写出依赖
-->
<optional></optional>
<!-- 排除依赖列表 -->
<!-- A 依赖B,B 依赖C ,现在使用A,但是我们不想下载C ,则排除C 的依赖 -->
<exclusions>
<exclusion>不想依赖构建的坐标</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖管理 -->
<!--
该依赖不会被加入到依赖列表里,主要是为了复用依赖
抽象出一个父类依赖,供其他依赖共同使用,必须Junit
-->
<dependencyManagement>
<!-- 依赖列表 -->
<dependency></dependency>
</dependencyManagement>
<build>
<!-- 插件列表 -->
<plugin>
<!-- 坐标 -->
</plugin>
</build>
<!-- 对 父模块 的继承 -->
<parent></parent>
<!-- 多个模块,一起编译 -->
<modules></modules>
maven 依赖范围
-- 依赖范围
<scope> </scope>
一共有 6 个可选项 ;
- compile 默认的范围,编译测试运行都有效 ;
- provided 测试、编译时有效 ;
- runtime 运行时有效 ;
- test 测试时有效 ;
- system 和 provide 差不多,但是和本地相关联,不便于移植 ;
- import 导入的范围,配合 dependencyManagement 使用,表示从其他的 pom.xml 文件中导入 dependency 的依赖;
maven 传递依赖
传递依赖就是,比如现在有三个项目:A,B,C ;其中 A 依赖于 B ,B 依赖于 C ;这样 A 和 C 之间就是传递依赖,我们编译 A 的时候,maven 会自动的把 C 也下载下来,但是我们 A ,只需要 B 就可以,因此,需要干掉传递依赖 ;
在依赖列表里面配置一下,就可以干掉传递依赖 ;
<exclusions>
<exclusion>不想依赖构建的坐标</exclusion>
</exclusions>
maven 依赖冲突
假如有 A 和 B 都依赖了 C ,但是依赖的 C 的版本不同 ,如果这时候有一个 X 同时依赖 A 和 B ,那么现在 X 到底依赖哪一个 C 呢? 这就是 依赖冲突;
-
短路优先
上述情况,X 到 C 的路径,是经过 A 短还是经过 B 短 ,谁更短,就选择依赖 谁;
-
谁先声明谁优先
如果路径一样长,则谁在 pom.xml 里面被先声明,就依赖谁 ;
maven 聚合和继承
-
聚合
当有项目需要打包,然后安装奥本地仓库的时候,可以使用聚合,一次性打包所有项目;
使用方法:
新建一个
maven
项目,当做容器,修改其pom.xml
文件,将打包方式改为pom
;然后配置<modules>
标签,标签体为需要打包编译的其他maven
项目的路径 ; -
继承
使用方法:
新建一个
maven
项目,修改其pom.xml
文件,将打包方式改为pom
,然后将重复的构件的左边,添加到<dependencyManagement>
标签中 ;在需要继承的
maven
项目中,在parent
标签中,写上父类的坐标 ,即可继承父类的<dependencyManagement>
标签中的构建 ;;