Maven 是 Java 平台上的自动化构建工具(Maven 本身也是使用 Java 编写的)。构建是指,以 Java 源文件、框架配置文件、HTML/CSS/JS/JSP、图片等资源为 原材料,去 生产 一个可以运行的工程项目的过程。

1. 构建的步骤(生命周期)

  • 清理:讲之前编译得到的旧的.class字节码文件删除,为下一次编译做准备
  • 编译:将 Java 源程序编译成 Class 字节码文件
  • 测试:自动测试,调用 Junit 程序
  • 报告:测试程序执行的结果
  • 打包:动态 Web 工程打成 War 包,Java 工程打成 Jar 包
  • 安装:讲打包得到的文件 复制仓库 中的特定位置
  • 部署:将动态 Web 工程生成的 War 包 复制 到 Servlet 容器中的指定目录下,使其可以运行

2.Pom 文件

Pom文件是Maven 工程的核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。

2.1 pom文件中的坐标

使用下面三个参数GAV在仓库中唯一定位一个 Maven 工程

G——groupId:公司或组织域名倒序 + 项目名

A——artifactId:模块名

V——version:版本号

例如定位一个springboot的启动类

<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>

依赖信息中除了目标 jar 包的坐标还有一个scope设置,这是依赖的范围 依赖的范围有几个可选值,我们用得到的是:compile、test、provided

compile 范围依赖

  • 对主程序是否有效:有效
  • 对测试程序是否有效:有效
  • 是否参与打包部署:参与

test 范围依赖

  • 对主程序是否有效:无效
  • 对测试程序是否有效:有效
  • 是否参与打包部署:不参与
  • 典型例子:junit

provided 范围依赖

  • 对主程序是否有效:有效
  • 对测试程序是否有效:有效
  • 是否参与打包部署:不参与
  • 典型例子:servlet-api

总结如下:

manven构建javafx maven的构建过程_java

例如:

如下依赖将不参与打包和主程序的使用。

<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.0.RELEASE</version>
<scop>test</scop>

2.2 仓库

  • 本地仓库:本地部署的仓库目录,为当前电脑所有 Maven 工程服务
  • 远程仓库
  • 私服:搭建在局域网中,为局域网范围内的所有 Maven 工程服务(公司自有服务器)
  • 中央仓库:搭建在 Internet 上,为全世界所有 Maven 工程服务
  • 中央仓库镜像:搭建在各大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求(如阿里云镜像,清华镜像,豆瓣)

manven构建javafx maven的构建过程_spring_02

 设置本地仓库

<settings>
    <!-- 本地仓库的地址,存放jar包-->
    <localRepository>${user.home}/.m2</localRepository>
    <mirrors>
    	<mirror>
        	<id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>
</settings>

设置私服

<repositories>
    <repository>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <id>public</id>
        <name>Public Repositories</name>
        <url>http://192.168.0.96:8081/content/groups/public/</url>
    </repository>
    <repository>
        <id>getui-nexus</id>
        <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</ur1>
    </repository>
</repositories>

镜像换源

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

2.3 Maven 的依赖、继承与聚合

1.依赖

1. 依赖排除,比如在springboot的依赖中通常会导入Logging的包,而你正好想用其他的logging依赖包则需要去除依赖。

<exclusions>
    <exclusion>
        <artifactId>commons-logging</artifactId>
        <groupId>commons-logging</groupId>
    </exclusion>
</exclusions>

2.统一管理依赖的版本号

这里对 Spring 各个jar包的依赖版本都是 4.0.0,如果需要统一升级为 4.1.1,手动修改不可靠。

 1)使用properties标签内使用自定义标签统一声明版本号

<properties>
    <vectorx.spring.version>4.0.0.RELEASE</vectorx.spring.version>
</properties>

2)在需要统一版本的位置,使用自定义标签名引用声明的版本号  

<version>${vectorx.spring.version}</version>

3)其实properties标签配合自定义标签声明数据的配置,并不是只能用于声明依赖的版本号。凡是需要统一声明后再引用的场合都可以使用 

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

2.继承

举例说明:

现状

  • Hello 依赖的 Junit 版本:4.0
  • HelloFriend 依赖的 Junit 版本:4.0
  • MakeFriends 依赖的 Junit 版本:4.9

由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致

需求

  • 统一管理各个模块工程中对junit依赖的版本

解决思路

  • junit依赖统一提取到“父”工程中,在子工程中声明junit依赖时不指定版本,以父工程中统一设定的为准。同时也便于修改

1)创建一个 Maven 工程作为父工程(注意打包方式为pom)

<groupId>com.vectorx.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

2)在父工程中统一junit的依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 3) 在子工程中声明对父工程的引用

<parent>
    <groupId>com.vectorx.maven</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.vectorx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>

4)删除子工程坐标中与父工程重复的内容

<parent>
    <groupId>com.vectorx.maven</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>

5)删除子工程中junit依赖的版本号部分

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>

3.聚合

作用:一键安装各个模块工程

配置方式:在一个”总的聚合工程”中的POM文件中配置各个参与聚合的模块 

<!--配置聚合-->
<modules>
    <!--指定各个子工程的相对路径-->
    <module>../Hello</module>
    <module>../HelloFriend</module>
    <module>../MakeFriends</module>
</modules>