Maven基础
1 Maven概念
Maven的功能:
- 依赖管理工具
- 项目管理工具
- 提供中央仓库,自动下载构件
2 Maven使用
- Idea中新建Maven项目
- 自动生成的pom.xml代码如下
<?xml version="1.0" encoding="UTF-8"?>
<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.elead</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
代码组成:
- XML头,指定文档版本和编码方式
- pom.xml根元素project
- modelVersoin:当前pom的模型版本
- 项目坐标
- groupId:项目所属组
- artifactId:当前Maven项目在组中的唯一ID
- version:为snapshot则为开发版本,不稳定
- name:可选,项目名说明
添加依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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.elead</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope></scope>
<optional></optional>
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
- 依赖坐标:groupId,artifactId,version
- 依赖类型:type
- 依赖范围:scope
- 依赖可选:optional
- 排除依赖:exclusions
2.1 设置HTTP代理
设置代理以获得访问外部仓库的权限(先检查能否直接ping通公共maven仓库、telnet测试端口连接):
my-proxy
true
http
218.14.227.197
3128
2.1 依赖范围
Maven有如下几种依赖范围:
- compile:默认范围,对于编译、测试、运行都有效
- test:测试有效,如JUnit
- provided:编译、测试有效,运行无效,如servlet-api,编译、测试时需要,运行时该依赖由容器提供
- runtime:测试和运行有效,编译无效,如JDBC驱动实现,编译时由JDK提供的JDBC接口,测试和运行时才需要该依赖
- system:系统依赖,和provided一致,但必须通过systemPath显式指定依赖文件路径
2.2 依赖传递
“A->B"为"A依赖B”。如果A->B->C,那么A会自动依赖C(传递依赖)。
假设A->B->C,A依赖B为第一列,B依赖C范围为第一行,A依赖C的结果为交叉格:
\ | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
- 如果A依赖B为compile,B依赖C为compile,则A依赖C为compile
- A依赖C的范围,不会超过A依赖B的范围,且除了compile之外,A对C的依赖如果有都只能为A对C的依赖
2.2.1 依赖调解
例如,A->B->C->X(2.0),A->D->X(1.0),则A会优先依赖X(1.0):
- 最短路径优先
- 最先声明优先(如果依赖路径一样长)
2.2.2 可选依赖
例如,当A->B->C(optional),如果A中没有使用C的功能,则A不会传递依赖C。
2.2.3 依赖排除
例如,当A->B->C,A->D,D依赖与C依赖相似但表现更好,此时在A中引入B时可以排除C依赖。
2.2.4 依赖版本统一管理
如果引入很多依赖,它们都属于同一个项目,版本号都一致,可以使用一个property变量来统一管理版本:
<properties>
<springframework.version>1.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
3 Maven仓库
Maven仓库分类:
- 本地仓库
- 远程仓库
- 中央仓库
- 私服
- 其它公共库
3.1 设置本地仓库地址
settings文件:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
3.2 配置远程仓库
第一种,配置Maven远程仓库,在settings文件中:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- central会覆盖maven本地的远程仓库
第二种,在pom.xml中配置
<!-- 配置远程仓库 -->
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
- 可以声明多个远程仓库
- id如声明为central,会覆盖中央仓库
- releases和snapshots声明下载快照版或发布版
- updatePolicy:检查更新频率
3.3 配置远程仓库认证信息
settings文件中:
<settings>
<!--配置远程仓库认证信息-->
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
3.4 部署构件到远程仓库
配置pom.xml:
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
参考:http://tengj.top/2018/01/01/maven/