• maven



    什么是 maven

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

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


    环境的搭建

    配置两个环境变量即可;

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

    常见命令的含义

    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> 标签中的构建 ;;

  • 相关阅读:
    Windows下Git多账号配置,同一电脑多个ssh-key的管理
    Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
    处理Linux下subversion尝试连接自建的VisualSVN server报“Key usage violation in certificate has been detected”错误的问题
    #Linux学习笔记# Linux文件的属性以及权限说明
    #Linux学习笔记# Linux文件的所有者、群组和其他人
    #Linux学习笔记# Linux在线帮助文档man page
    #Linux学习笔记# Linux系统查看文件内容的命令
    #Linux学习笔记# 自定义shell终端提示符
    Docker私有仓库Registry的搭建验证
    LinuxMint下Docker的安装部署和验证
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665623.html
Copyright © 2020-2023  润新知