maven 基础知识笔记

Maven 的生命周期

一个完整的项目构建过程包括

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

在 maven 中 定义了三套独立的生命周期, 分别是:
clean 清理项目

pre-clean 执行清理前的工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的工作

default 构建项目 (最核心)
site 根据项目的 pom.xml 生成项目站点

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

pom.xml 常用元素

pom 的常用元素有 project : pom的根元素, 包含了pom的一些约束信息 modelVersion : 指定了当前pom的版本 项目坐标
groupId
主项目标识, 表示pom属于哪个实际的项目
<groupId>反写的公司网址+项目名</groupId>

artifactId

项目中模块的标识

<artifactId>项目名+模块名</artifactId>

version

当前项目的版本号

<version>大版本号.分支版本号.小版本号</version>

小版本号后又可以跟以下修饰
- SNAPSHOT 快照版本
- alpha 内部测试版本
- beta 公测版本
- Release 稳定版本
- GA 正式发布版本

packaging: 指定项目打包方式 默认是jar
name: 项目描述名, 产生项目文档时使用
url: 项目的地址
description: 项目的描述
developers: 开发人员的列表
licenses: 许可证信息
organization: 组织信息

重要标签 dependencies, dependencyManagement, build

<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <type></type>
        <scope></scope>
        <!--
        optional 有两个取值 true or false
        用来设置依赖是否可选 默认是false, 子项目会自动继承该依赖
        否则子项目需要显示引入该依赖
        -->
        <optional></optional>
        <!-- 排除依赖传递列表 -->
        <exclusions>
            <exclusion>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
<!-- 依赖的管理 
这里定义的依赖并不会被运行
主要定义在父模块中用于让子模块继承
-->
<dependencyManagement>
    <dependencies>
        <dependency></dependency>
    </dependencies>
</dependencyManagement>

<build>
    <!-- 插件列表 -->
    <plugins>
        <plugin>
            <groupId></groupId>
            <artifactId></artifactId>
            <version></version>
        </plugin>
    </plugins>
</build>

<!-- 用于子模块中对父模块的继承 -->
<parent></parent>
<!-- 聚合多个maven项目 -->
<modules></modules>

依赖(dependency)的相关知识

依赖的范围

<scope></scope>

maven中提供了三种项目 classpath: 编译、测试、运行
依赖的范围就是用来控制依赖与三种 classpath 的关系的
scope标签有六个可选的值,分别是:

compile: 默认的范围,编译测试运行都有效
provided: 在测试及编译时有效,运行时不会被加入
runtime: 在测试及运行时有效
test: 只在测试时有效
system:provided一样,测试及编译时有效,但是与本机系统相关联,可移植性差
import: 只使用在dependencyManagement中,表示是从其他pom中导入的依赖配置,下面是maven官网给出的例子

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>maven</groupId>
  <artifactId>B</artifactId>
  <packaging>pom</packaging>
  <name>B</name>
  <version>1.0</version>
  <dependencyManagement>
    <dependencies>
      <dependency>
      <!-- A 中的依赖都会被导入到B中 -->
        <groupId>maven</groupId>
        <artifactId>A</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

依赖冲突

如果A和B分别依赖了一个构件的不同版本,对于同时依赖A和B的C就会产生依赖冲突。
1. 短路优先
C会优先解析路径短的版本
2. 先声明先优先
如果路径长度相同,则谁先声明先解析谁

聚合和继承

聚合

聚合就是将多个项目一起进行操作
需要建立一个maven项目,编辑pom文件

<!-- 修改packaging 为pom -->
<packaging>pom</packaging>
<!-- 假设要聚合maven 项目 A、B、C -->
<modules>
    <module>A的路径</module>
    <module>B的路径</module>
    <module>C的路径</module>
</modules>
mvn clean install

maven会依次生成并安装A、B、C到本地仓库中

继承

假设A、B、C都依赖于D,就可以建立一个maven项目E作为parent,使A、B、C继承E中配置的依赖D

<!-- E的依赖配置, 需要将D写在 dependencyManagement 中 -->
<packaging>pom</packaging>

<dependencyManagement>
    <dependencies>
        <dependency>
        <!-- 此处填写 D 的坐标 -->
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- A、B、C 中 pom的配置 -->
<parent>
    <!-- 此处填写 E 的坐标 -->
</parent>

常见问题解决


  1. maven编译web项目显示软件包 javax.servlet.http 不存在

解决方法:在pom.xml中加入以下依赖即可

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值