Maven温习笔记

整理maven基础使用

安装maven

下载

配置环境变量

  • MAVEN_HOME maven的安装目录
  • Path %MAVEN_HOME%\bin
  • 检测 mvn --version

maven仓库

本地仓库

maven在本地存储的地方 默认在用户目录.m2/repository下 配置文件中指定

<settings>
  <localRepository>目录</localRepository>
</settings>

配置文件默认位置 MAVEN_HOME/conf/settings.xml

可以根据模板创建,可以单个项目指定单独的配置文件和本地仓库

远程仓库

  1. 中央仓库

默认的Apache远程仓库,可在setting.xml文件中修改默认中央仓库地址 包括大多数流行的开源Java构件、源码、及详细信息

<repositories>
  <repository>
    <id>central</id>
    <name>Central Repository</name>
    <url>http://repo.maven.apache.org/maven2</url>
    <layout>default</layout>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>
  1. 私服

  2. 其他公共仓库

镜像仓库

在~/.m2/setting.xml配置maven镜像仓库

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

在idea创建maven项目

从模板创建

Create from archetype

maven-archetype-quickstart

maven-archetype-webapp

可以指定单独的而配置文件和本地仓库地址

标准目录结构

  • src
    • main
      • java
      • resources
      • webapp
        • WEB-INF
          • index.jsp
        • css、js
    • test
      • java
      • resources
  • target
  • pom.xml

POM文件

project 工程根标签

modelVersion pom模型版本,maven2和3只能为4.0.0

groupId

artifactId

version

packaging maven项目的打包方式 jar war ear三种格式

properties 定义变量

dependencies 依赖信息

scope

compile 编译|运行|测试|打包 都有效 默认 如 common-logging

provided 编译|测试 有效,运行|打包 无效,运行时由JDK或某个服务器提供 如 servlet-api 如果使用compile会被打包,在运行时可能会和Tomcat容器中的servlet-api.jar包版本号冲突

test 仅测试有效 如 junit

runtime 编译时不需要,测试|运行|打包时有效 如log4j jdbcDriver,实现类使用配置文件动态加载

runtime对于单元测试和运行时是生效的,但在编译时则不生效,这通常可能是【动态加载】的代码,例如jdbc驱动程序,它们在程序代码中没有直接引用。

将依赖项设置为运行时可确保不存在对代码的意外依赖,并防止依赖项可传递。因此,例如,如果模块A对库X具有运行时依赖关系,而模块B依赖于模块A,则它不会继承对库X的依赖关系。使用“provided”或“compile”将导致B依赖于X。

system 不推荐使用,不会去本地仓库寻找依赖,要指定本地路径image-20191105012923725

构建流程

clean -> compile -> test -> package

生命周期

maven的生命周期lifecyle由一系列阶段phase构成

clean、compile、test等都是phase

maven构建项目就是执行指定的phase

mvn compile #将执行compile这个phase

mvn clean test #将执行clean、compile、test这些phase

执行一个phase会触发一个或多个Goal

执行compile这个phase会执行compiler:compile这个goal

执行test这个phase会执行compiler:testCompile、surefile:test两个goal

理解Maven的概念、Lifecycle、Phase、Goal

  • 使用Maven构建项目就是执行Lifecycle
  • 执行Lifecycle就是按顺序执行一系列Phase
  • 每执行一个Phase,都会执行该Phase绑定的若干Goal
  • Goal是最小执行任务单元

常用的命令:mvn clean package 不会打包依赖的jar

命令

maven通过调用不同的插件Plugin来构建项目

mvn compile 将执行compile这个Phase

调用compiler插件执行compile

compiler插件执行和compile关联的compiler:compile这个Goal

模块

把大项目拆分为模块是降低软件复杂度的有效方法

提取公共部分作为parent,parent不包含任何java代码

parent的packaging为pom

在子模块中声明parent标签,指定parent信息

子模块继承parent之后不再需要groupId

###模块化编译

如果子A模块依赖子模块B,则模块A需要模块B的jar包才能正常编译

告诉maven几个模块之间存在依赖关系,maven会自动按照依赖顺序编译子模块,不用指定编译顺序

<modules>
	<modules>模块A</modules>
	<modules>模块B</modules>
</modules>

版本冲突

依赖传递:添加依赖的jar包如果还依赖其他jar包,则会被一起引入

依赖冲突:如 项目依赖A依赖tool1.0 项目依赖B依赖C依赖tool2.0 项目被编译时,tool1.0和tool2.0会造成冲突

根据路径最近策略,该项目最终依赖tool1.0,可能会导致B中使用2.0的新特性不存在造成异常

解决冲突

  1. 直接引入
    项目中引入tool2.0

  2. 排除 在A的dependency标签中使用exclusions标签排除tool,使B中的tool生效

<dependency>
	<groupId>xxx.yy</groupId>
 	<artifactId>A</artifactId>
	<exclusions>
		<exclusion>
			<groupId>mm.nn</groupId>
			<artifactId>tool</artifactId>
			<!--排除的时候不用写版本号-->
		</exclusion>
	</exclusions>
</dependency>
  1. 版本锁定

版本锁定

dependencyManagement

在该标签下添加的dependencies可以声明依赖,但不会引入jar包

在project标签下的dependencies的依赖才会引入jar包

在dependencyManagement下添加依赖后,在project下的dependencies的版本号可以忽略不写

properties标签可以自定义版本号,用el表达式赋值给version标签

统一管理jar包版本,方便修改

<properties>
  <my.key>1.1.0</my.key>
</properties>

<dependencyManagement>
  <dependencies>
    <dependecy>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${my.key}</version>
    </dependecy>
  </dependencies>
</dependencyManagement>

<!--如果不使用dependencyManagement 也可以使用properties-->
<dependecy>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${my.key}</version>
</dependecy>
文章目录
,