【Java】中Maven依赖详解

14天阅读挑战赛

一、maven概念
      maven是 Apache 下的一个纯 Java 开发的开源项目。
      基于项目对象模型(缩写:POM)概念,
      Maven利用一小段描述信息管理一个项目的构件。
      Maven 是一个项目管理工具,
      可以对 Java 项目进行构建以及对依赖进行管理。

二、Maven环境安装
    1、maven官方网站
       http://maven.apache.org/
       下载apache-maven-3.5.0-bin.zip压缩包
    
    2、解压压缩包到D盘根目录下
       目录结构
         --bin:mvn的运行脚本
         --conf:配置文件
         --boot:包含一个类加载器框架
         --lib:maven运行时类库

    3、配置maven环境变量
          环境变量: 
          MAVEN_HOME    D:\apache-maven-3.5.0
          Path          %MAVEN_HOME%\bin;
          测试:mvn -v  查看当前版本
  
    4、修改本地仓库默认位置(主要用于存储从网络上下载的jar)
        1>在maven根目录下新建一个空目录repository
        2>在con/settings.xml中配置
       <localRepository>D:\apache-maven-3.5.0\repository</localRepository>

    5、修改maven项目默认的jre版本(默认1.5)
        拷贝以下配置到conf/settings.xml的profiles中
    <profile>
        <id>jdk-1.8</id>
            <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>

    6、在eclipse中配置maven插件
    1>确保eclipse版本为4.0以上
    2>window-->preferences-->Maven-->Installations-->关联maven
    3>User Settings-->关联conf/settings.xml


三、maven项目构建及常用命令
  1、项目组成
      groupId:项目的包名 组织名,公司网址反写+项目名
      artifactId:项目名-模块名(没分模块就是项目名)
      version:项目版本
      SNAPSHOT:快照版本
      packing:打包方式(默认jar)

  2、maven目录结构
       src/main/java             java源码
       src/main/resources        项目配置文件
       src/test/java             测试类
       src/test/resources        测试需要的配置文件
       Maven Dependencies        项目依赖的jar包
       target                    项目打包目录
       pom.xml                   项目对象描述信息

  3、cmd常用命令(都必须在项目根目录下执行)
         删除target目录         mvn clean
         编译项目:              mvn compile
         运行测试用例           mvn test
         打包命令生成jar        mvn package        
   安装jar到本地仓库中          mvn install  

  4、eclipse运行
      项目右键项目run as-->maven builder...
                -->compile(package,test,install)
  

四、坐标和仓库概念
1、坐标
    在maven中,任何的依赖,插件,项目构件的输出都可以称之为构件
    所有的构件都通过坐标作为其唯一的标识,类似于购物时填写的
    电话和地址来找到你

    坐标写法:
        <groupId>com.lanou.testMaven</groupId>
        <artifactId>testMaven</artifactId>
        <version>0.0.1-SNAPSHOT</version>

    groupId,artifacteId,version可以构成一个坐标
    groupId:包名.项目名
    artifactId:项目名-模块名
    version:当前项目版本号:一般都是由3个数字表示 
            第一个0:大版本号 
            第二个0:分支版本还号 
            第三个0:小版本号 0.0.1 
             snapshot:快照 
             alpha:内测版本
             beta:公测版本
             release:稳定版本 
             GA:正式发布版本

2、仓库
     用于管理项目中所有的依赖(jar),
     当前项目本身也可以install安装成jar安装到仓库
     提供给其他人进行使用

     1>本地仓库
       用于存储从网络上下载的所有依赖(jar),
       以及可以将项目本身打包成jar,提供给其他人使用
       更改本地仓库位置:settings.xml
       <localRepository>
            D:\apache-maven-3.5.0\repository
       </localRepository>
       
     2>中央仓库:存储着全世界所有的依赖jar
        地址:https://repo.maven.apache.org/maven2

     3>镜像仓库
        因为中央仓库在国外,直接下载比较慢,因此可以一个组织搭建
        一个镜像仓库,从镜像仓库下载

         相当于私服
            <mirror>      
                <id>maven.net.cn</id>
                <!--为哪个仓库配置镜像-->
                <mirrorOf>central</mirrorOf>
                <name>central mirror in china</name>
                <!--镜像仓库路径-->
                <url>http://maven.net.cn/content/groups/public</url>   
        </mirror>
        
        阿里云镜像:
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
                
 
五、maven生命周期(面试重点*****)
1、生命周期
     完整的项目构建过程:clean,compile,test,package,install
     清理->编译->测试->打包->集成测试->验证->部署

     maven生命周期:
     1>clean    清理项目
         1.1>pre-clean 执行清理前的工作
         1.2>clean 清理上一次构件生成的所有文件
         1.3>post-clean 执行清理后的文件   
     2>defaut   构建项目(最核心)
         2.1>compile
         2.2>test
         2.3>package
         2.4>install
     3>site      生成项目站点
        3.1>pre-site 在生成项目站点前要完成的工作
        3.2>site 生成项目的站点文档
        3.3>post-site 在生成项目站点后要完成的工作
        3.4>site-deploy 发布生成的站点到服务器上
      
七、maven依赖范围(面试重点*****)
    1、什么是依赖范围
        规定项目导入的依赖jar在编译 、测试 、运行哪个生命周期范围内有效
    
        2、依赖范围值
    在dependency标签中通过<scope>test</scope>配置
        scope有6种值:
    http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

    1>compile:默认的范围,编译测试运行都有效

    2>provided:在编译和测试时有效,运行无效
      如:servletapi编译时加入,运行不需要,因为
         容器中有,在加入会报错

    3>runtime:在测试和运行时有效

    4>test:只在测试范围内有效
      如:junit单元测试

    5>system:根provided一样,只在编译和测试有效
      但与本机系统相关联,可移植性差(javahome)

    6>import:导入的依赖范围,它只使用在
        dependencyManagement中,表示从其他的pom中
        导入dependency的配置
    
    如:将A中依赖导入B中
    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>maven</groupId>
      <artifactId>B</artifactId>
      <packaging>pom</packaging>
      <name>B</name>
      <version>1.0</version>
      
      <dependencyManagement>
        <dependencies>
          <dependency>
        <groupId>maven</groupId>
        <artifactId>A</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      

八、依赖传递以及排除传递依赖(面试重点*****)
      1、什么是传递依赖
        假如有Maven项目A,项目B依赖A,项目C依赖B。
        那么我们可以说 C依赖A。也就是说,
        依赖的关系为:C—>B—>A。那么我们执行项目C时,
        会自动把B、A都下载导入到C项目的jar包文件夹中。
        这就是依赖的传递性。

        案例:
        山鸡-->南哥   南哥-->B哥   
        那么山鸡-->B哥  传递依赖
    
    创建三个maven project
    1>b哥执行install安装
    2>南哥依赖b哥
    3>南哥执行install安装
    4>删除依赖南哥
    
    此时观察山鸡项目maven Dependencies会发现虽然山鸡
    只依赖于南哥却将b哥也依赖进来了,山鸡可以使用
    exclusions标签排除b哥依赖

    <dependency>
          <groupId>com.hongxing</groupId>
          <artifactId>hongxing-nange</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <!-- 排除依赖 -->
          <exclusions>
              <!-- 排除依赖列表 -->
              <exclusion>
                  <groupId>com.hongxing</groupId>
                <artifactId>hongxing-bGe</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
    
    
九、依赖冲突(面试重点*******)
    1、什么是依赖冲突
      在传递依赖过程中,如果一个项目依赖了两个不同版本的jar,具体以哪个为准
    如:在不排除山鸡传递依赖的前提下,如果B哥依赖了commons-io2.4的版本
        而南哥依赖了commons-io2.0的版本,那么山鸡同时依赖两个,具体版本是哪个

    2、依赖冲突解决方案:(面试重点*******)
    1、短路优先原则
       A->B->C->X(.jar)
       A->D->X(.jar)   优先
    
        B哥依赖commons-io2.4的版本
         路径:山鸡->南哥->B哥->commons-io2.4
        南哥依赖commons-io2.0的版本
         路径:山鸡->南哥->commons2.0
        此时观察山鸡会依赖2.0的版本,因为山鸡离南哥近
    
    2、先声明,先优先
    如果路径相同,则谁先声明,先解析谁
    如:让山鸡同时依赖南哥和B哥
        将山鸡中排除B哥依赖删除掉
       
       此时会发现先引入谁的依赖,那么版本就是谁的
       
十、聚合和继承
    聚合:对多个项目放在一起运行,同时进行安装
    如:聚合B哥,南哥,山鸡三个项目
    创建项目hongxing-parent,打包方式为pom
    聚合三个项目:
    <modules>
        <module>../hongxing-bGe</module>
        <module>../hongxing-nange</module>
        <module>../hongxing-shanji</module>
    </modules>
    然后执行clean install会发现同时安装三个项目
    
    继承:如果三个子项目都使用了junit
    1、在父项目中定义如下配置:
    <properties>
        <!-- 规定统一版本号 -->
        <junit.version>3.8.1</junit.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>      
    </dependencies>
    
    2、让三个子项目继承父项目
        <parent>
            <groupId>com.hogxing</groupId>
            <artifactId>hongxing-parernt</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
    
        子项目会继承父工程的依赖,子工程中可以不用写groupId和version
        
    3、如果需要在子工程中有选择性的去继承父工程中依赖,
       需要将父工程中依赖写在dependencyManagement标签中,
       子工程需要该依赖可以通过定义groupId和artifactId继承
       父工程中:
        <properties>
            <!-- 规定统一版本号 -->
            <junit.version>3.8.1</junit.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                </dependency>      
            </dependencies>
        </dependencyManagement>
       
        子工程中:
        <parent>
            <groupId>com.hogxing</groupId>
            <artifactId>hongxing-parernt</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>      
        </dependencies>
        
       
       
十一、将本地自己的jar安装到本地仓库
        以D:\jdbcutil.jar为例:
        1>cmd中切换到D盘
        2>执行命令:
        mvn install:install-file -Dfile=jdbcutil.jar -DgroupId=com.xxx -DartifactId=jdbcutil -Dversion=0.0.1.RELEASE -Dpackaging=jar  
        
 
十二、创建web项目并发布
      1、创建maven项目,打包方式为war,
      2、创建创建后,在project视图下,右键选择
          Deployment...->generate 生成web-inf和web.xml等目录
      3、依赖导入servlet3.1.0版本
      4、需要修改web.xml的版本为3.1      
        
        
      聚合工程:        
      1、可以使用聚合工程将mvc三层分成三个模块,
          3.1>父工程打包方式为pom
          3.2>controller层打包方式war,dao和service两层为jar
          3.3>service依赖dao,controller依赖service
      2、只需要将web模块加入Tomcat执行
      
      
    Tomcat插件:
    <build>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
              <port>8888</port>
            </configuration>
          </plugin>
        </plugins>
    </build>
      
   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

God Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值