Maven核心知识

Posted chan_ai_chao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven核心知识相关的知识,希望对你有一定的参考价值。

1.maven常用的构建命令

(1)mvn -v      查看maven版本

(2)compile    编译

(3)test        测试

(4)package      打包

(5)clean     删除target

(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)手动添加缺失文件夹

  • 创建好的项目结构缺少一些文件夹,手动补全,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)部署tomcat

  • 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中继承过来

以上是关于Maven核心知识的主要内容,如果未能解决你的问题,请参考以下文章

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

《Linux内核 核心知识全解析(完)》

CSP核心代码片段记录

android小知识点代码片段

Java itext为pdf 文件添加水印核心功能代码片段

Maven 基础知识总结笔记