1.POM文件
<?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>homethy-whitepages-reptile</groupId>
<artifactId>homethy-whitepages-reptile</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
modelVersion:POM 模型的版本
groupId:项目属于哪个组,或哪个组与此有关联
artifactId:定义了项目在Maven中唯一的ID
version:版本号
2.maven主要命令
- mvn clean complie 编译主代码
- mvn clean test 编译测试代码,在这之前会编译主代码, 测试资源处理,测试代码编译
- mvn clean package 打包,默认为jar
- mvn clean install 将jar安装到maven的本地仓库
第五章 坐标与依赖
1. 坐标详解
```
<dependency>
<groupId>com.homethy</groupId>
<artifactId>homethy-crm-search-client</artifactId>
<version>2.2.0</version>
<packaging>jar</packaging>
</dependency>
```
- groupId 定义当前
Maven
项目隶属的实际项目 - artifactId 定义实际项目中的一个
Maven
项目 - version 定义
Maven
项目所处的版本 - packaging 定义
Maven
的打包的测试,jar 或 war - classifier 定义构建输出的一些附属组建
2. service.properties
email.protocol = smtps
email.host = smtp.gmail.com
email.username = you-id@gmail.com
email.password = your-password
email.auth = true;
eamol.systemEmail = your-id@juvenxu.com
在pom.xml中的表现:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholder-Configure">
<properties name="protocol" value="${email.protocol}"/>
<properties name="host" value="${email.host}"/>
....
</bean>
3. 依赖的配置
<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<exclusions>
<exclusion>
...
</exclusion>
...
</exclusions>
</dependency>
...
</dependencies>
...
</project>
- groupId, artifactId, version : 依赖的基本坐标
- type : 依赖的类型,对应packaging
- scope : 依赖的范围
- optional : 标记依赖是否可选
- exclusions : 用来排除传递性依赖
4. 依赖范围 scope
- compile : 编译依赖范围。如果没有指定,默认使用该依赖范围
- test : 测试依赖范围, 只针对测试classpath有效,在编译主代码或者运行项目的使用时将无法使用该依赖
- provided : 已提供依赖范围。使用此依赖,对于编译与测试 classpath 有效,但在运行时无效
- runtime : 运行时依赖范围。对于测试和运行classpath有效,在编译主代码时无效
- system : 系统依赖范围。和provided依赖范围完全一致。但必须通过systemPath元素显示地制定依赖文件的路径
依赖范围(scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的,Maven仓库之外的类库文件 |
5.传递性依赖
项目依赖一个依赖,该依赖又依赖另外的依赖,该项目虽然直接依赖,但不要单独引入这些依赖。
6.传递性依赖与依赖范围
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 |
7. 依赖调解
A-->B-->C-->X(1.0)
A-->D-->X(2.0)
第一原则:最短路径优先
A-->B-->Y(1.0)
- 可选依赖:可选依赖不被传递,在项目中显式声明
- 排除依赖:<exclusions>
- 归类依赖:使用统一的version来管理版本
<!--使用<version>${springframework.version}</version>-->
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
- 优化依赖
mvn dependency:list : 查看当前项目的依赖
mvn dependency:tree :
mvn dependency:analyze : 分析编译主代码需要用到的依赖
第六章: 仓库
Maven
的世界中,任何一个依赖、插件、或者项目的构建输出,都可以称为构件。Maven
中统一存储这些所有Maven
构件的地方,称为 Maven仓库
1. 仓库的布局
groupId/artifactId/artifactId-version.packaging
实例:构件路径的生成:groupId=org.testng, artifactId=testng, version=5.8, classifier=jdk15, packageing=jar
1\.基于groupId:org/testng
2\.基于artifactId: org/testng/testng
3\.使用版本信息:org/testng/testng/5.8
4\.使用连接符‘-’,artifactId-version
org/testng/testng/5.8/testng-5.8
5\.若有classifier
org/testng/testng/5.8/testng-5.8-jdk5
6\.检查构件的extension,它由packaging决定,生成的最终路径为
org/testng/testng/5.8/testng-5.8-jdk5.jar
2.仓库的分配
- 本地仓库
- 远程仓库:中央仓库,私服,其他仓库
- 中央仓库
Maven
必须知道至少一个中央仓库 - 私服
特殊的中央仓库,部署在局域网的仓库服务。私服不存在该构件时,由外部的远程仓库下载。
3.远程仓库的配置
配置 POM 使用仓库
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
- repository : 声明一个远程仓库
- id : 一个仓库的id,唯一
- name : 仓库名称
- url : 仓库地址
- release : 控制对于发布版本构件的下载
- enable : 开启仓库对于发布版本构件下载的支持
- checksumPolicy : 控制校验文件的策略
- warn : 默认,Maven在验证时输入警告信息
- fail : 校验错误使构建失败
- updatePolicy :
- daily
- never
- always
- interval : 跟时间,每个多少分钟更新一次
- snapshots : 控制对于快照版本构件的下载支持
- enable :
- checksumPolicy :
- updatePolicy :
4.远程仓库的认证
在setting.xml文件中配置仓库认证信息
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
- server
- id : 仓库定义时在 repository 中设置的 id
- username
- password
5.部署至远程仓库
<distributionManagement>
<repository>
<id>proj-release</id>
<name>Proj Release Repository</name>
<url>http://192.168.1.100/content/repositories/proj-releases</url>
</repository>
<snapshotRepository>
<id>proj-snapshot</id>
<name>Proj Snapshot Repository</name>
<url>http://192.168.1.100/content/repositories/proj-snapshot</url>
</snapshotRepository>
</distributionManagement>
mvn clean install 将构件部署到远程仓库
- repository : 配置发布构件部署
- snapshotRespository : 配置快照版本构件部署
- id : 远程仓库的唯一id
- name : 为了方便人阅读
- url : 仓库地址
6.快照版本
快照版本在每次发布的时候Maven
都会都会为其打上时间戳,在执行
mvn clean install -U
的时候,会从仓库中找到最新的快照版本
7.从仓库中解析依赖的机制
- 当依赖的范围为
system
的时候,Maven 直接从本地系统中解析构件。 - 根据路径先由本地仓库寻找构件,存在则解析成功
- 若本地不存在相应的构件,依赖的版本又是发布版本构件,则遍历所有的远程仓库,发现后,解析并使用。
- 若依赖为
RELEASE
或LATEAST
,则基于更新策略读取所有的远程仓库的元数据(groupId/artifactId/version/maven-metadata.xml),将其与本地仓库的对应元数据合并后,计算RELEASE
或LATEAST
的值, 基于这个值去检查本地与远程仓库 - 若依赖为
snapshot
,则基于更新策略读取所有的远程仓库的元数据(groupId/artifactId/version/maven-metadata.xml),将其与本地仓库的对应元数据合并后,得到快照的值,基于这个值检查本地与远程 - 如果最后解析的为时间戳格式的
snapshot
如:1.4.1-20091104
,则复制其时间戳格式到非时间戳格式SNAPSHOT
,并使用非时间戳的构件
8. 镜像
若仓库 X 能提供 仓库 Y 存储的所有内容,则称 X 为 Y 的镜像,合适的镜像往往速度更快。
配置私服镜像settings.xml:
<mirrors>
<mirror>
<id>internal-repository</id>
<name>Internal Repository Manager</name>
<url>http://192.168.1.100</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
- id : 仓库id, 唯一
- name : 方便阅读
- url : 仓库地址
- mirrorOf
-
<mirrorOf> * </mirrorOf>
: 匹配所有的仓库 -
<mirrorOf> external:*</mirrorOf>
: 匹配所有仓库,使用localhost的除外,即排除本机 -
<mirrorOf> repo1, repo2 </mirrorOf>
: 匹配仓库 repo1, repo2 -
<mirrorOf> *, !repo1 </mirrorOf>
: 匹配所有仓库,repo1除外
-
9.仓库的搜索服务
- Sonartype Nexus
提供结果共构件的坐标及其所属仓库 - Jarvana
提供浏览构件内部的内容 - MVNbrowser
显示构件依赖的构件 - MVNrepository
显示各个构件的版本变化