maven


什么是 maven

maven 是一种项目管理工具,帮助我们管理项目的结构,各种 jar 包,简化项目的构建;

不要与 Git 混淆,都是管理项目,但是一个是版本控制,一个是目录结构的控制 ;


环境的搭建

配置两个环境变量即可;

  1. 配置一个系统环境变量,名字随便取,值为下载的 maven 的文件夹路径 ;
  2. 在 path 路径里面添加一个,%上一步取的名字%\bin

常见命令的含义

  1. mvn -v 查看 maven 版本

  2. mvn compile 编译

    编译会在目录下面生成一个 target 文件夹;

  3. mvn test 测试

  4. mvn package 打包

  5. mvn clean 删除 target

  6. mvn install 将项目打成 jar 包,安装到仓库里面


自动生成 maven 的目录骨架

maven 官方要求的目录结构如下:

src
	- mian
		- java
			- package
	- test
		-  java
			- package 
	resource

既然 maven 本身是管理项目结构的,那么它一定也有方法自己生成该目录结构 ;

  1. archetype:generate 按照提示一步一步的写上模块名、版本号等等 ;
  2. 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,.......等等一堆报错

这就是因为网络问题,则打开 mavensetting 配置文件,设置代理 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 默认去 中央仓库 下载需要的东西 ;

这里我们可以配一下,也就是之前,我修改的 mavensetting 配置文件 ;

 	<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 目录下面 ;

继续修改 mavensetting 配置文件 ;

找到 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 的生命周期和插件

定义了三套相互独立的生命周期:

  1. clean 清理项目
  2. default 构建项目(最核心
  3. site 根据 pom.xml 文件中的信息生成项目站点 ;

三套生命相互独立 ;

每个生命周期内部,又有自己的阶段,执行其中的一个阶段,必定会 依次执行 该阶段之前的阶段 ;但是,各个生命周期内部的执行,不会触及到其他另外两套生命周期 ;

clean 清理项目 内部又分为三个阶段 ;
  1. pre-clean 执行清理前的工作
  2. clean 清理上一次构建生成的所有文件
  3. post-clean 执行清理后的文件
clean 构建项目内部阶段 ;
  1. compile 编译
  2. test 测试
  3. package 打包
  4. install 安装
site 生成站点项目内部阶段 ;
  1. pre-site 在生成站点前要完成的工作
  2. site 生成项目站点
  3. post-site 在生成项目站点以后要完成的工作
  4. 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 个可选项 ;

  1. compile 默认的范围,编译测试运行都有效 ;
  2. provided 测试、编译时有效 ;
  3. runtime 运行时有效 ;
  4. test 测试时有效 ;
  5. system 和 provide 差不多,但是和本地相关联,不便于移植 ;
  6. 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 呢? 这就是 依赖冲突

  1. 短路优先

    上述情况,X 到 C 的路径,是经过 A 短还是经过 B 短 ,谁更短,就选择依赖 谁;

  2. 谁先声明谁优先

    如果路径一样长,则谁在 pom.xml 里面被先声明,就依赖谁 ;


maven 聚合和继承

  1. 聚合

    当有项目需要打包,然后安装奥本地仓库的时候,可以使用聚合,一次性打包所有项目;

    使用方法

    新建一个 maven 项目,当做容器,修改其 pom.xml 文件,将打包方式改为 pom ;然后配置 <modules> 标签,标签体为需要打包编译的其他 maven 项目的路径 ;

  2. 继承

    使用方法

    新建一个 maven 项目,修改其 pom.xml 文件,将打包方式改为 pom ,然后将重复的构件的左边,添加到 <dependencyManagement> 标签中 ;

    在需要继承的 maven 项目中,在 parent 标签中,写上父类的坐标 ,即可继承父类的 <dependencyManagement> 标签中的构建 ;;

posted @ 2018-11-29 17:47  Yiaz  阅读(128)  评论(0编辑  收藏  举报