Maven入门(中)——Maven的基础知识

1.自动创建目录骨架

  • 利用archetype插件,用于创建符合maven规定的目录骨架(目录见4)

2.常用的构建命令介绍

  • 利用archetype自动创建目录骨架

    • 构建普通项目:

      mvn archetype:generate -DgroupId=com.imooc.maven03 - DartifactId=maven03-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

      ​ - com.imooc.maven03:groupId(包内容)【即组织名,公司网址的反写+项目名】

      ​ - maven03-service:artifactId(项目名-模块名)

    • 构建Web项目:

      mvn archetype:generate -DgroupId=project-packaging -DartifactId=project-name -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

3.maven中的坐标和仓库

  • 坐标
    • 构件:构件通过坐标作为其唯一的标识
  • 仓库(管理项目的依赖)
    • 本地仓库
    • 远程仓库(全球中央仓库【存放大量的jar】)——地址设置在maven安装包/lib/maven-model-builder-3.5.4.jar中org/apache/maven/model/pom.xml<repopsitories>下的<url>
  • 镜像仓库
    • 国内镜像仓库设置地址:maven包/conf/settings.xml下的<mirrors>中的<mirror>(<mirrorof>需要时central,即中央仓库的id)
  • 更改本地仓库的位置
    • 依旧修改settings.xml文件,中的<localRepository>设置了对应的本地仓库的地址

4.eclipse安装maven插件以及创建maven项目

  • 在preferences中存在Maven选项
  • 创建maven项目:
    • new -> maven project 选择对应的插件创建不同骨架的项目
  • 运行运行maven项目:
    • 项目右击 -> run as -> maven build -> 在Goals中书写对应命令 -> Run

5.maven生命周期和插件

  • 完整项目的构建过程包括:

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

  • maven生命周期(对于生命周期的阶段而言,执行某个阶段默认之前之前的阶段内容):

    • clean 清理项目

      • pre-clean 执行清理前的工作
      • clean清理上一次构建生成的所有文件
      • post-clean执行清理后的文件
    • default 构建项目【核心】

      compile、test、package、install

    • site 生成项目的站点(根据pom生成相应站点)

      • pre-site在生成项目站点前要完成的工作
      • site生成项目的站点文档
      • post-site在生成项目站点后要完成的工作
      • site-deploy发布生成的站点到服务器上
  • 添加插件

    加入source插件

    • 指定source插件坐标

    • 绑定其他阶段

      利用<executions>中绑定并设置goal目标(goal是根据插件不同,有不同的goal)

    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.imooc.hi</groupId>
      <artifactId>himaven-project</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>himaven-project</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
      </build>
    </project>

6.pom.xml常用元素介绍

  • pom.xml

    pom是maven项目的管理文件,用于项目描述、组织管理、依赖管理和构建信息的管理

  • <project>是pom的根元素,包含pom约束信息

  • <modelVersion> 指定当前pom的版本

  • 坐标信息

    • <groupId> 主项目标识,用定义当前maven属于哪个实际的项目,即为项目创建的包
    • <artifactId> 模块标识,通常以项目名+模块名标识
    • <version> 当前项目的版本号 大版本号.分支版本号.小版本号
    • <packaging> 打包的类型,默认为jar,还可以是war/zip/pom
    • <name> 项目描述名
    • <url> 项目地址
    • <description> 项目描述
    • <developers> 开发人员列表
    • <license> 许可证信息
    • <organization> 组织信息
  • <dependencies>依赖列表

    • <dependency> 依赖项
      • <groupId>
      • <artifactId>
      • <version>
      • <type>
      • <scope> 表示依赖范围,值为test表示jar只在测试范围内有用,如在主代码中引入该类则会报错
      • <optional> 设置依赖是否可选,true和false(默认)
      • <exclusions>排除依赖传递的列表
      • <exclusion>设置排除的依赖
  • <dependencyManagement> 依赖的管理(定义在父模块中)

    • <dependencies>依赖列表
  • <build> 为构建的行为提供相应的支持

    • <plugins> 插件列表
      • <plugin> 插件
      • <groupId>
      • <artifactId>
      • <version>
  • <parent> 用于在子模块中关于父模块pom的继承

  • <modules> 用来聚合运行多个的maven项目,可以一起编译

    • <module>

7.依赖范围

  • 我们开发时需要用到的jar包就要引入到该项目的classpath路径中,此时就可以使用该框架。
  • maven中提供的三种classpath
    • 编译
    • 测试
    • 运行
  • <scope>的值就是控制依赖与classpath的关系
  • <scope>属性
    • compile 默认的范围,对编译测试运行都有效
    • provided 在测试和编译时有效
    • runtime 在测试和运行时有效
    • test 只在测试范围有效
    • system 在编译和测试时有效,与本机系统相关联,可移植性差
    • import 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置

8.依赖传递

  • 依赖具有传递性

    当B依赖A,C依赖B时,如果对C进行compile,将导入A和B的jar包

  • 排除依赖传递

    利用在C中添加<exclusions> –> <exclusion> –> A的groupId和artifactId

    则在C中自动去除A的依赖

    //pom.xml (A)
    <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">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.project1</groupId>
    <artifactId>project1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    <name>project1</name>
    <url>http://maven.apache.org</url>
    
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    </project>
    
    //pom.xml (B)
    <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">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.project2</groupId>
    <artifactId>project2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    <name>project2</name>
    <url>http://maven.apache.org</url>
    
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>com.project1</groupId>
        <artifactId>project1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </dependency>
    </dependencies>
    </project>
    
    //pom.xml (C)
    <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">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.project3</groupId>
    <artifactId>project3</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    <name>project3</name>
    <url>http://maven.apache.org</url>
    
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>com.project2</groupId>
        <artifactId>project2</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>com.project1</groupId>
                <artifactId>project1</artifactId>
            </exclusion>
        </exclusions>
      </dependency>
    </dependencies>
    </project>

9.maven项目的jre版本

  • 默认是1.5版本
  • 可以右击properties修改或是在settings.xml文件中添加<profile>进行修改

10.依赖冲突原则

  • 短路优先

    A 依赖 B ,B 依赖 C ,C依赖X(jar)

    A 依赖 D ,D依赖 X(jar)

    则A 依赖的是 D 依赖的X的版本

    //pom.xml A
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project1</groupId>
      <artifactId>project1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project1</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
        </dependency>
      </dependencies>
    </project>
    
    //pom.xml B
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project2</groupId>
      <artifactId>project2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project2</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.project1</groupId>
            <artifactId>project1</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.0</version>
        </dependency>
      </dependencies>
    </project>
    
    //pom.xml C
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project3</groupId>
      <artifactId>project3</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project3</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.project2</groupId>
            <artifactId>project2</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.project1</groupId>
                    <artifactId>project1</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
      </dependencies>
    </project>
    
    则最终C依赖的是B的common-io的版本,因为B离C近
  • 先声明先优先

    如果路径长度相同,则谁先声明,先解析谁(即在dependency中谁定义在前面就以谁的版本为准)

    //pom.xml A
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project1</groupId>
      <artifactId>project1</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project1</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
        </dependency>
      </dependencies>
    </project>
    
    //pom.xml B
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project2</groupId>
      <artifactId>project2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project2</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.0</version>
        </dependency>
      </dependencies>
    </project>
    
    //pom.xml C
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project3</groupId>
      <artifactId>project3</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project3</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
         <dependency>
            <groupId>com.project1</groupId>
            <artifactId>project1</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.project2</groupId>
            <artifactId>project2</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
      </dependencies>
    </project>
    
    由于C中同时引用A和B,A和B中都引用common-io(但版本不同),又由于在C的pom.xml中,A在B的声明前,故以A引入的common-io版本加入到C中

11.聚合和继承

  • 聚合:即将模块统一打包安装到本地仓库中

    //project_aggreation.xml
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.projectaggreation</groupId>
      <artifactId>project_aggreation</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
    
      <name>project_aggreation</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <modules>
        <module>../project1</module>
        <module>../project2</module>
        <module>../project3</module>
      </modules>
    </project>
    
    运行mvn install 可以看到三次构建,分别将三个模块打包成jar安装到本地仓库中(注意packaging的值为pom,modules为打包安装的模块)
  • 继承:子pom继承父pom中的依赖信息

    //project_parent pom.xml
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.projectparent</groupId>
      <artifactId>project_parent</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
    
      <name>project_parent</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit-version>3.8.1</junit-version>
      </properties>
    
      <dependencyManagement>
          <dependencies>
            <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>${junit-version}</version>
              <scope>test</scope>
            </dependency>
          </dependencies>
      </dependencyManagement>
    
    </project>
    
    //project3 pom.xml
    <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.project3</groupId>
      <artifactId>project3</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>project3</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <parent>
        <groupId>com.projectparent</groupId>
        <artifactId>project_parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </parent>
      <dependencies>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
         </dependency>
         <dependency>
            <groupId>com.project1</groupId>
            <artifactId>project1</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.project2</groupId>
            <artifactId>project2</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
      </dependencies>
    </project>
    
    利用parent标签进行继承,指定父pom的坐标,并指定需要的依赖坐标版本即会按照父pom的版本进行安装。
    xml中使用properties可以指定属性,并利用${自定义标签名}进行取值

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/81479503
今日推荐