1. 什么是Maven?

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
类似的工具有:

  • Maven
  • Ant
  • gradle

2. Maven的三个特点

  • POM(Project Object Model)
    • 以XML文件的形式组织管理,配置很多信息来完成我们需要的功能,例如:依赖管理,生命周期,插件的需要等。。。
  • Dependency Management
    • 在XML文件中配置<dependency .../>标签来导入依赖的包
  • Coordinates
    • Maven看做一个仓库,Coordinates就用来定位包的位置,有三个属性:
    • groundId:
    • artifactId:
    • version:
    • packageing:

3. 安装Maven

1. 下载并解压Maven

例如maven解压在D:\MyJarLib\apache-maven-3.3.9目录下

2. 配置环境变量(M2_HOME,Path)

我的电脑–>右键–>高级系统模式–>高级–>环境变量–>在系统变量下新建一个
M2_HOME名称,路径为D:\MyJarLib\apache-maven-3.3.9保存。–>classPath编辑
%M2_HMONE%\bin;保存。
cmd 命令下输入mvn -version显示如下则成功:

C:\Users\hp>mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:4
7+08:00)
Maven home: D:\MyJarLib\apache-maven-3.3.9
Java version: 1.8.0_65, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_65\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"

修改本地仓库路径和软件库位置

默认的maven本地仓库在%HOME%该路径在windows下面实在C:\Users\hp\.m2\repository如果已经分过盘,放在C盘是不明智的,我们需要更改路径。
示例:
1. 创建D:\MyJarLib\repo文件夹作为新的本地仓库
2. 在Maven的安装目录下找到settings.xml文件D:\apache-maven-3.3.9\conf拷贝到新的仓库目录下面
3. 修改settings.xml并保存
<localRepository>D:/MyJarLib/repo</localRepository>
4. cmd打开maven项目并输入:mvn install命令,maven会自动下载依赖包到更改后的本地仓库
5. 查看新的本地仓库,修改完成

3. 配置Maven配置文件(本地仓库路径,镜像)

打开Maven安装目录下面的conf文件夹,有一个settings.xml文件,将该文件拷贝到电脑的%HOME%\.m2路径下,这样每次升级Maven都不需要重新配置了。

注意:此处的%HOME%\.m2%HOME%指的是输入CMD命令后的显示的默认HOME如:

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\hp>

软件库位置:

此处的C:\Users\hp就是%HOME%了,在该文件架下面有一个.m2文件夹

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   | 默认的软件库位置就在此处
   | Default: ${user.home}/.m2/repository
   -->
  <localRepository>/path/to/local/repo</localRepository>

Mirror镜像:

减轻本地仓库的压力,当用需要访问软件包的时候可以访问mirror的仓库。

由于 ‘墙’ 的原因,默认的mirror用不成了,此处使用了阿里云mirror的URL

具体解决方案参考博客:—此处是连接—

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
    </mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
    -->
  <!-- 由于 '墙' 的原因,默认的mirror用不成了,此处使用了阿里云mirror的URL  -->
    <mirror>
      <!--This sends everything else to /public -->
      <id>nexus</id>
      <mirrorOf>*</mirrorOf> 
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
    <mirror>
      <!--This is used to direct the public snapshots repo in the 
          profile below over to a different nexus group -->
      <id>nexus-public-snapshots</id>
      <mirrorOf>public-snapshots</mirrorOf> 
      <url>http://maven.aliyun.com/nexus/content/repositories/snapshots/</url>
    </mirror>
  </mirrors>

4. 使用Maven创建项目

打开MyEclipse–>Preference–>MyEclipse–>Maven4myEclipse–>Installations–>右上角的add–>找到Maven的安装目录,然后确定–>最后确保setting.xml文件的路径正确。

如下图:

maven

5. HelloMaven

Maven的目录结构:

src
    -main
        -java
            -package
    -test
        -java
            -package
    resources:存放资源文件

Maven常用命令:

mvn -v  查看maven版本
    compile  编译
    test  测试
    package  打包

    clean  删除target
    install  安装jar包到本地仓库中

如果提示错误,找不到符号等等…直接使用mvn clean 清除target之后再次mvn compile即可

Maven创建目录的两种方式

每次创建maven的结构目录实在很麻烦,maven给我们提供了自动创建的插件,只要按照提示输入按照提示开始输入groupId,artifactId,vresion之后便会自动创建Maven的骨架结构。

1. mvn archetype:generate   按照提示进行选择
2. mvn archetype:generate 
        -DgroupId="组织名,公司网址的反写+项目名"
        -DartfactId="项目名-模块名"
        -Dversion="版本号"
        -Dpackage="代码所在的包名"
  1. 新建一个Maven03文件夹,并使用cmd打开该文件夹路径
  2. D:\Java works\Maven03>mvn archetype:generate然后maven会开始下载各种插件和依赖包
  3. 按照提示开始输入groupId,artifactId,vresion等:
Choose a number : 6 : 6      ---> 选择版本号
Define value for property 'groupId': : com.bart.maven03.service
Define value for property 'artifactId': :maven03-srevice
Define value for property 'version':1.0-SNAPSHOT :1.0.0SNAPSHOT
Define value for propert 'package': com.bart.maven03: :com.bart.maven03.service

Maven项目完整构建过程

graph LR
清理-->编译
编译-->测试
测试-->打包
打包-->集成测试
集成测试-->验证
验证-->部署

maven生命周期:

  • clean:清理项目
    • pre-clean:执行清理前的工作
    • clean:清理上一次构建所生成的文件
    • post-clean:执行清理后的文件
  • default:构建项目(最核心)
    • compile:编译
    • test:测试
    • package:打包
    • install:安装
  • site:生成项目站点
    • pre-site:再生成项目站点之前要完成的工作
    • site:生成项目的站点文档
    • post-site:再生成项目站点之后要完成的工作
    • site-deploy:发布生成的站点到服务器上

Maven的pom.xml详解

<name>项目的描述名</name> 
<url>项目的地址</url> 
<description>项目描述</description> 
<developers>开发人员信息</developers> 
<licenses>许可证信息</licenses> 

<!-- 依赖列表 -->
<dependencies>
<!-- 依赖项 -->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope>依赖的范围</scope>
<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>
</build>

<!-- 一般在子模块中指定所继承的父模块 -->
<parent></parent>

<!-- 模块列表 -->
<modules>
<module></module>
</modules>

Maven的依赖

  1. 依赖的范围:
    • compile 默认 编译 测试 运行
    • provided 编译 测试
    • runtime 测试 运行 如jdbc
    • test 测试 如Junit
    • import 只在的dependencyManagerment中有效 表示从其它pom中导入dependency配置
    • system 与本机系统相关
<!--   导入junit依赖  -->
    <dependencies>
        <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
            <version>4.10</version>
        <!-- 依赖范围 -->
        <scope>test</scope>
    </dependency>
  1. 依赖的传递:
    例如:
A-->B
B-->C(jar)

在这里A依赖于B而B依赖于C则A依赖于C,这就是依赖的传递

  1. 依赖的冲突:
    • 短路优先:
A-->B-->C-->X-jar
A-->D-->X-jar

可得A依赖D为最短路径
- 先声明,先优先
如果路径长度一样,则先声明谁,就先解析谁

A-->X-1.0-jar
A-->X-2.0-jar

这时候A依赖于同一个X,但是版本不同。此时在A的pom.xml中先声明谁,就先依赖谁。

<groupId>com.bart.maven.A</groupId>
<artifactId>maven-A</artifactId>
<version>0.0.1SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>com.bart.maven.X</groupId>
        <artifactId>maven-X</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>com.bart.maven.X</groupId>
        <artifactId>maven-X</artifactId>
        <version>2.0</version>
    </dependency>
</dependencies>

此处由于1.0的X声明在2.0之前所以A的依赖X版本就是1.0-jar。

Maven的聚合和继承

1. 聚合

对于多个项目一起编译,这种方式叫做聚合。
还以上面的ABC三个项目作为例子说明;
三者设定了传递依赖关系,并且经过配置,但是此时不想一个一个的由高到低的编译/打包/安装,此时可以在A的pom.xml文件的根目录中加入如下元素标签,只需要对A进行打包安装即可实现对B和C的打包和安装,这种一同编译安装的方式,就叫做聚合。

<modules>
        <module>../C</module>
        <module>../B</module>
</modules> 

2. 继承

依然以ABC三个说明,ABC都有junit的依赖,但是每个pom.xml都要配置junit很麻烦了,这时候可以创建一个P,使得P拥有Junit的依赖,然后让ABC三个项目继承P即可。

P-Junit|-->A
       |-->B
       |-->C

P的pom.xml配置

<groupId>com.bart.maven.p</groupId>
<artifactId>maven-p</artifactId>
<version>0.0.1SANPSHOT</version>

<properties>
    <junit-version>3.1.8</junit-version>
</properties>

<dependencyManagement>
   <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit-version}</version>
    </dependency>
</dependencies> 
</dependencyManagement>

A,B,C的pom.xml配置

<parent>
    <groupId>com.bart.maven.p</groupId>
    <artifactId>maven-p</artifactId>
    <version>0.0.1SANPSHOT</version>
</parent>

这样A,B,C就不用每个都配置Junit了,光继承P就可以了。

吐槽一下CSDN的MarkDown编译器,竟然不识别graph流程图的语法。。。又要把画好的重新修改一遍。。。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐