maven系列1-maven的使用

Table of Contents

1 maven概念

1.1 作用(便利)

  1. 管理jar包
    1. 增加第三方jar
    2. 管理jar包之间的依赖关系(自动关联下载所有依赖的Jar,并且不会冲突)
  2. 将项目拆分成若干个模块

编译-打包-部署-测试 –>自动化测试

1.2 概念

maven是一个基于java的自动化构建工具

自动化构建工具maven:将原材料(java、js、css、html、图片等)–>产品(可发布的项目)

1.2.1 构建工具发展历史

make-ant-ivy-maven-gradle

1.2.2 maven操作

日常写代码的流程:写Java代码->执行; IDE起的作用:java->class->执行;

maven至少能完成的工作

  • 清理:删除编译的结果,为重新编译作准备
  • 编译:Java->class
  • 测试:针对项目中的关键点进行测试,也可以用项目中的测试代码去测试开发代码
  • 报告:将测试的结果进行显示
  • 打包:将项目中包含的多个文件压缩成一个文件,用于安装或部署
  • 安装:将打成的包放到 本地仓库
  • 部署:将打成的包放到 服务器 上准备运行

2 maven安装配置

2.1 下载、安装、配置环境

配置环境,可使用软连接

2.2 配置本地仓库

maven目录/conf/settings.xml

2.3 约定优于配置

maven约定的目录结构:

模块名
   --src                   
      --main               :程序功能代码
         --java            :java文件
         --resources       :资源文件,配置文件
      --test               :测试代码
         --java
         --resources
   --pom.xml               :项目对象模型

坐标gav

<!--域名反转.大项目名-->
<groupId>com.newgrand</groupId>

<!--子模块名-->
<artifactId>helloworld</artifactId>

<!--版本号-->
<version>0.0.1-SNAPSHOT</version>

仓库概念

3 maven常用命令

执行mvn: 必须在pom.xml所在目录执行

3.1 常见命令

首次执行是会下载基础组件

  • mvn compile –只编译main目录中的Java文件
  • mvn test –测试
  • mvn package –jar/war
  • mvn install –将开发的模块,放入本地仓库,供其他相关模块使用(放入的位置,是通过gav坐标决定)
  • mvn clean –删除target目录(编译产生的文件)

在ide中使用maven

  1. 配置maven版本
  2. 配置本地仓库 -修改settings.xml

4 maven生命周期

4.1 生命周期

4.1.1 package

  1. resources
  2. compile
  3. test
  4. building Jar

4.1.2 生命周期阶段

  1. clean lifecycle: 清理
  2. default lifecycle: 默认
  3. site lifecycle: 站点

5 Maven依赖、依赖排除、依赖有效性、通过maven整合多个项目

maven在编译、测试、运行项目时,各使用一套classpath

执行 compile test provided
主程序
测试程序
部署

5.1 依赖的范围、依赖的有效性

依赖范围scope: compile(默认)、test、provided

5.2 依赖排除

<exclusions>
    <exclusion>
        <groupId>xx</groupId>
        <artifactId>yy<artifactId>
    </exclusion>
</exclusions>

5.3 依赖的传递性

A.jar–> B.jar–>C.jar

要使A.jar ->C.jar :一般来说仅当B.jar依赖于C.jar的范围是compile

多个maven项目(模块)之间如何依赖; P项目->q项目

  1. p项目 install到本地仓库
  2. q项目依赖:
<dependency>
    <groupId></groupId>
    <artifactId></artifactId>
    <version></version>
    <scope>compile</scope>
</dependency>

6 依赖的传递性、依赖原则、统一版本、统一编码

6.1 依赖原则

  1. 路径最短原则
  2. 路径长度相同:
    1. 在同一个pom.xml声明两个相同的依赖,后面的生效(覆盖)(不建议)
    2. 如果是不同的pom.xml中有2个相同的依赖时,先声明的生效(首先)

6.2 统一版本、统一编码

building path: 删除旧的,增加新的

pom.xml

  1. 配置properties节点及其子节点
  2. 配置build>plugins>plugin节点及其子节点
 <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
 </properties>

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
</plugins>

${}

7 继承、聚合

7.1 打包方式

  1. Java项目打包成jar
  2. web项目打包成war
  3. 父工程打包成pom

7.2 继承

方便版本的管理,子工程可以通过父工程,统一管理依赖的版本

7.2.1 继承实现方式

  1. 建立父工程

    父工程的打包方式为pom

  2. 在父工程中编写依赖
    <dependencyManagement>
        <dependencies>
            <dependency>
                 gav
            <dependency>
        </dependencies>
    </dependencymanagement>
    
  3. 子类继承父工程
    1. 加入父工程坐标
    2. 当前工程的pom.xml到父工程pom.xml的相对路径
    <!--父pom-->
    <parent>
        <groupId>x</groupId>
        <artifactId>y</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../xx/pom.xml</realativePath>
    </parent>
    
  4. 子类声明使用的依赖

    声明需要引用的父类依赖

7.3 聚合

maven 将一个大工程拆分成 若干个子工程(模块)

聚合可以将拆分的多个子工程合起来

maven项目能够识别的:自身包含的、本地仓库中的

前置工程的install操作可以通过“中搞定”

7.3.1 聚合的使用

 <modules>   
    <module>paycenter-facade</module><!--client层用于定义自身服务的对外服务(接口)需要打成jar,提供给消费方-->
    <module>paycenter-common</module><!--common层一般将service,dal,facade三层之间对象转换时用的model,以及从各层抽取出的公用代码--> 
    <!--<module>demo-dal</module>&lt;!&ndash;dal层负责和数据库交互映射,外部服务包装&ndash;&gt;--> 
    <module>paycenter-service</module><!--service层负责应用业务逻辑,依赖dal,实现facade层定义业务接口-->
</modules>

聚合只能配置在打包方式为pom的工程中,以后只要操作总工程

module的顺序无所谓

mvn clean : 删除target文件

8 maven创建、部署web工程

8.1 手动

  1. 打成war包
  2. 放到tomcat

8.2 通过mvn执行部署运行web项目

bulid->cargo

<build>
    <!-- finalName:表示部署的项目名称,即war包名称也可以不声明 -->
    <finalName>WebProject</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.6.0</version>
            <configuration>
                <!-- 指定Web容器的名称和路径 -->
                <!--【1】containerId表示容器的类型 -->
                <!--【2】home表示容器的安装目录,-->
                <!--【3】type可以不声明,取默认值installed; -->
                <container>
                    <containerId>tomcat7x</containerId>
                    <home>D:\JAVA\apache-tomcat-7.0.70</home>
                </container>

                <!-- 配置信息:用于配置部署的模式及复制容器配置到什么位置 -->
                <!--【1】type:部署模式,有三种值【standalone,existing,runtime】-->
                <!-- standalone:将指定的web容器配置信息复制到指定路径,并将部署应用到指定路径;-->
                <!-- existing:将应用部署到现有的web容器中,不需要重新复制容器的配置信息 -->               
                <!-- runtime:既不使用独立的容器配置,也不使用本地现有的容器配置,而是依赖一个已运行的容器。-->
                <!--【2】home:指定路径,部署应用的路径 -->
                <configuration>
                    <type>standalone</type>
                    <home>${project.bulid.directory}/tomcat7x</home>
                </configuration>
            </configuration>
         </plugin>
    </plugins>
</build>