Maven核心知识

1.maven经常使用的构建命令

(1)mvn -v      查看maven版本java

(2)compile    编译web

(3)test        测试apache

(4)package      打包浏览器

(5)clean     删除targettomcat

(6)install       安装jar包到本地仓库中服务器

2.maven自动创建目录骨架

(1)archetype插件

  • 用于建立符合maven规定的目录骨架
  • 先建立一个文件夹,其名为project名

(2)自动建立目录方式一

  • win+R,cmd,cd到该文件夹路径下,输入mvn archetype:generate,enter,第一次会自动下载一些相关依赖
  • enter,输入6
    • 'groupId' 输入com.gc.maven;
    • 'artifactId'输入maven-service;
    • 'version'输入1.0.0SNAPSHOT;
    • 'package'输入com.gc.maven.service,
    • enter,输入y
  • 至此自动建立成功
  • 这是按照提示进行选择的方法

(3)自动建立目录方式二

  • win+R,cmd,cd到该文件夹路径下
  • 输入mvn archetype:generate -DgroupId=组织名,公司网址的反写+项目名 -DartifactId=项目名-模块名 -Dversion=版本号 -Dpackage=代码所存在的包名

3.maven中的坐标和仓库

(1)坐标

  • 构件经过坐标做为其惟一标识
  • groupId,artifactId,version组成项目的基本坐标

(2)仓库

  • 仓库管理项目的依赖
  • 本地仓库和远程仓库:打开maven—>lib—>maven-model-builder-3.5.4.jar,用360压缩打开,org—>apache—>maven—>model—>pom-4.0.0.xml,打开,找到<url>https://repo.maven.apache.org/maven2</url>,即为远程仓库
  • 镜像仓库:打开maven—>conf—>settings.xml,找到mirrors,配置1-2个镜像     
   <mirror>
      <id>jboss-public-repository-group</id>
      <mirrorOf>central</mirrorOf>
      <name>JBoss Public Repository Group</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
   </mirror>
   <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
   </mirror>
  • 更改仓库位置:默认本地仓库在c盘中C:\Users\guochan\.m2,若是重装系统可能丢失,因此要更改仓库位置 
    • 建立一个本地文件夹其路径为E:\maven-3.5.0\repository,打开maven—>conf—>settings.xml,找到localRepository,
    • <localRepository>E:/maven-3.5.0/repository</localRepository>
    • win+R cmd ,输入命令mvn compile测试是否成功

4.在Intellij IDEA中配置maven以及建立maven项目

(1)配置maven

  • Ctrl+Shift+A,输入maven,选择maven settings
    • 在maven home directory中选择maven文件夹目录,我这里是D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
    • 在user setting file中选择override,填入修改好本地仓库位置的配置文件,我这里是D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
    • local repository会自动检测到修改过的本地仓库路径
  • 在settings搜索框中输入runner,找到maven下的runner,在VM Options中输入-DarchetypeCatalog=internal,若是未配置会致使maven 骨架生成速度缓慢
  • File—>other settings—>default settings,再将刚才配置一遍,在建立maven项目的时候就不用重复配置了
  • 若是没有安装tomcat,到http://tomcat.apache.org/中download core下的zip直接解压便可,点击安装目录bin/startup.bat启动服务

(2)建立maven web项目

  1)新建maven项目框架

  • File—>New—>Project,选择maven,在create from archetype打勾,选择,next
  • 输入groupId和artifactId,next
  • 仍然选择maven home directory为D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
  • user setting file选择override,为D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
  • local repository会自动检测到修改过的本地仓库路径
  • 上述加下划线的三步若是在default settings中配置过便可忽略
  • 点绿色的+,Name中输入archetypeCatalog,Value中输入internal,OK(该属性设置能够加快项目建立速度),next,finish
  • 若是建立maven项目失败,错误[ERROR] Maven execution terminated abnormally (exit code 1)
    • 缘由:若是path里有两个java环境,则会致使建立失败
    • 解决办法:查看Path路径下发现有C:\ProgramData\Oracle\Java\javapath和%JAVA_HOME%\bin这两个java环境,删除C:\ProgramData\Oracle\Java\javapath便可正常建立

  2)手动添加缺失文件夹jsp

  • 建立好的项目结构缺乏一些文件夹,手动补全,Alt+Insert,按照上一篇的目录结构添加directory,在main下添加java和resources,在src下添加test和resources
  • Ctrl+;调出Project Structure,点击Modules,main下的java选择Sources,main下resources选择Resources;test下的java选择Tests,test下的resources选择Test Resources

  3)部署tomcatmaven

  • Run—>Edit Configurations(Ctrl+Shift+J),点绿色+,34 items more,找到Tomcat Server—>Local
    • 在Name中输入Tomcat名称
    • 在Server选项卡中:  Application server选择本机Tomcat安装路径
    • 在Deploment选项卡中:  点绿色+,选择Artifacts,选择 项目:war exploded,在Application context中填入/项目名/index.jsp
    • 切回Server选项卡中:   On 'Update' action选择Update classes and resources;On frame deactivation选择Update classes and resources;OK
  • 点击Run或者Debug,浏览器自动跳转出http://localhost:8080/项目名/index.jsp/,完成

5.maven的生命周期和插件

(1)完整项目的构建过程

  • 清理、编译、测试、打包、集成测试、验证、部署

(2)maven生命周期

  • clean  清理项目
    • pre-clean              执行清理前的工做
    • clean                    清理上一次构建生成的全部文件
    • post-clean            执行清理后的文件
  • default   构建项目(最核心)
    • compile
    • test
    • package
    • install
  • site   生成项目站点
    • pre-site           在生成项目站点前要完成的工做
    • site                      生成项目的站点文档
    • post-site              在生成项目站点后要完成的工做
    • site-deploy          发布生成的站点到服务器上

(3)maven的插件

  • 详细插件信息可查看http://maven.apache.org/plugins/index
  • 下面以使用source插件为例,但愿运行package时便可将源码打包,在pom.xml中写入
<build>
    <plugins>
      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.4.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>jar-no-fork</goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  • 其中goals能够从上述网站中查看

6.maven中pom.xml解析

  • 小技巧:在写pom.xml时能够参考http://mvnrepository.com/ 
<?xml version="1.0" encoding="UTF-8"?>


<!--project是pom.xml的根元素,包含pom约束的信息-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <!--指定当前pom的版本,也是必不可少的元素-->
  <modelVersion>4.0.0</modelVersion>


  <groupId>反写的公司网址+项目名</groupId>
  <artifactId>项目名+模块名</artifactId>
  <!--第一个0表示大版本号
      第二个0表示分支版本号
      第三个0表示小版本号
      0.0.1
      snapshot   快照
      alpha      内部测试
      beta       公测
      Release    稳定
      GA         正式发布
  -->
  <version>1.0-SNAPSHOT</version>
  <!--jar war zip pom-->
  <packaging>war</packaging>


  <name>项目描述名</name>
  <url>项目地址</url>
  <description>项目描述</description>
  <developers>开发人员列表</developers>
  <licenses>开源框架许可证信息</licenses>
  <organization>组织信息</organization>


  <!--依赖列表-->
  <dependencies>
    <!--依赖项-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <type></type>
      <!--依赖范围 test表示junit只在测试的依赖范围内有用,在main主代码中引用junit会报错-->
      <scope>test</scope>
      <!--设置依赖是否可选,有true和false,默认是false,子项目继承,若为true,子项目必须显示引入该依赖-->
      <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>
    <!--一般用于子模块对父模块pom的继承-->
    <parent></parent>
    <!--用来聚合运行多个maven项目,使不少maven模块一块儿编译-->
    <modules>
      <module></module>
    </modules>
  </build>
</project>

7.maven依赖范围

(1)<scope>

  • maven的依赖范围
  • 开发时使用某一框架,将该项目的jar包引入到项目的classpath路径中,项目便可使用该框架为咱们封装好的一些方法
  • 依赖范围就是控制依赖与classpath的关系

(2)maven中的classpath

  • 编译 
  • 测试:例如junit依赖范围中的值test代表junit只存在于测试的classpath中
  • 运行

(3)scope的值

  • 打开http://maven.apache.org/,点击右侧栏中的Documentation-Index(category),点开Introductions-The Dependency Mechanism(依赖机制),找到Dependency Scope
  • 有6种scope的值,介绍以下
    • compile:默认的范围,在编译、测试、运行时都有效。
    • provided:在编译、测试时有效。例子:Servlet API加载,运行时不会被加入,由于web容器已经包含了这些API,若是加入进去会致使冲突。
    • runtime:在测试、运行时有效。例子:jdbc驱动的实现,项目主代码的编译只须要JDK提供的jdbc的API,只有在执行测试和运行项目的时候才须要实现接口的具体的jdbc驱动。
    • test:只在测试时有效。例子:junit。
    • system:与provided相同,在编译,测试时有效,与本机系统相关联,可移植性差,换机子之后可能会出问题。好比咱们要引用本机的JAVA_HOME,若是把项目移植到其余系统上,可能因为路径的不一致而致使错误。
    • import:导入的依赖范围,它只使用在dependencyManagement中,表示从其余的pom中导入dependency配置(是从其余pom中继承的依赖)。

8.maven依赖传递

(1)依赖传递的例子

  • 假设A依赖于B,B依赖于C
  • 首先在B的pom.xml中添加B对C的依赖
<dependency>
    <groupId>com.gc.C</groupId>
    <artifactId>C</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 再在A的pom.xml中添加A对B的依赖
<dependency>
    <groupId>com.gc.B</groupId>
    <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 而后对C clean package(生成C的jar包) install(C的jar包安装到本地仓库中);再对B clean package(生成B的jar包) install(B的jar包安装到本地仓库中)
  • 对A clean compile,即会发如今A的Maven Dependencies中有B.jar和C.jar。在A的pom.xml中并无配置C,因此这就是传递依赖

(2)排除依赖

  • 若A只想依赖于B,不想依赖于C,则可在A的pom.xml中加入exclusion,这样A中Maven Dependencies就自动去除了C.jar
<dependency>
      <groupId>com.gc.B</groupId>
      <artifactId>B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
            <exclusion>
                <groupId>com.gc.C</groupId>
                <artifactId>C</artifactId>
             </exclusion>
       </exclusions>
</dependency>

9.maven依赖冲突

(1)产生依赖冲突的场景

  • A和B依赖了不一样版本的相同的构件,那么对依赖A、B的C来讲依赖的是哪一个版本的构件,这就产生了依赖冲突

(2)两条原则

  • 短路优先
    • A—>B—>C—>X(jar)
    • A—>D—>X(jar),选择此依赖
  • 先声明先优先
    • 若是路径长度相同,则谁先声明,先解析谁

10.maven聚合和继承

(1)使用聚合的场景:

  • maven中将多个项目install,将其安装到本地仓库中,聚合能够将他们放到一块儿运行,称为聚合

(2)聚合的例子:

  • 想要将项目A,B,C一块儿install到本地仓库中
  • 新建一个新的maven项目D,其pom.xml以下
    <packaging>pom</packaging>
    
      <modules>
       <module>../A</module>
       <module>../B</module>
       <module>../C</module>
      </modules>
  • 对D的pom.xml clean install,便可将A,B,C生产jar包并安装到本地仓库中
  • D的pom.xml做为其余项目pom的容器

(3)使用继承的场景:

  • 不少项目的pom.xml中有不少重复的配置,例如junit等,能够利用继承减小配置

(4)继承的例子:

  • 假设有parent项目和sub项目,则分别配置parent和sub的pom.xml
  • 新建一个新的maven项目parent,其pom.xml以下
<packaging>pom</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.11</junit.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
  • 在sub项目中的pom.xml修改以下(将junit中的version和scope删除):
    <parent>
      <groupId>com.gc.parent</groupId>
      <artifactId>parent</artifactId>
      <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
      </dependency>
    </dependencies>
  • 此时junit就能够从parent的pom中继承过来