maven

51 阅读5分钟

maven适用于快速、方便构建项目资源的软件,能够通过简单的配置就是先对项目的依赖资源进行管理

maven是如果做到的?pom的配置文件

maven项目的构建是基于pom(Project Object Model)文件进行的,项目的所有配置信息都会存放在pom文件中,包括了项目的类型、名字、依赖关系、定制插件等等

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>com.itwanger</groupId>
    <artifactId>MavenDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MavenDemo</name>
</project>
  1. project:是pom文件的根元素,声明了pom文件的命名空间和xsd元素
    1. 关于命名空间和xsd元素的理解和定义,参考这篇文章www.jianshu.com/p/49d44ffc9…
      1. 命名空间:命名空间主要作用就是用来唯一定位一个标签。如果同时读取了一个或者多个相同名称的xml文件且它们中有的标签名称也有相同的情况,此时如果没有命名空间则无法唯一定位一个标签。
      2. xsd元素:定义校验xml格式的文件,一般需要指定要校验的命名空间和xsd文件所在地
  1. modelVersion:指定了当前pom文件的版本
  2. groupId:定义了当前项目属于哪个组织
  3. artifactId:定义了当前项目在组织中的唯一ID
  4. version:指定当前项目的版本,SNAPSHOT快照代表当前项目还在开发中
  5. name:当前项目的名称

其中

groupId、artifactId、version这三个元素定义了一个项目的基本坐标,在maven项目中任何的jar、pom都是基于这些坐标进行区分的

<project>
...
<dependencies>
    <dependency>
        <groupId>实际项目</groupId>
     <artifactId>模块</artifactId>
     <version>版本</version>
     <type>依赖类型</type>
     <scope>依赖范围</scope>
     <optional>依赖是否可选</optional>
     <!—主要用于排除传递性依赖-->
     <exclusions>
         <exclusion>
           <groupId></groupId>
          <artifactId></artifactId>
       </exclusion>
     </exclusions>
  </dependency>
<dependencies>
...
</project>
  1. dependencies:可以包含一个或者多个dependency,用于声明一个或者多个项目的依赖
  2. type:指定依赖类型默认为jar
  3. scope:指定依赖范围
  4. optional:标记依赖是否可选
  5. exclusions:排除传递性依赖

依赖范围

  1. compile:默认的依赖范围,表示当前依赖需要参入当前项目的编译、测试、运行周期
  2. test:表示依赖仅参入测试相关工作,包括测试代码的编译和运行,如junit
  3. runtime:表示依赖无需参与到项目的编译,不过测试和运行时需要
  4. provided:运行时不需要,其余编译和测试需要。运行时由别的容器提供
  5. system:和provided类似,但是不通过maven仓库解析,可能会造成构建不可移植

传递依赖

依赖可选

<project>  
    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.itwanger</groupId>  
    <artifactId>project-b</artifactId>  
    <version>1.0.0</version>  
    <dependencies>  
        <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <version>5.1.10</version>  
            <optional>true</optional>  
        </dependency>  
        <dependency>  
            <groupId>postgresql</groupId>  
            <artifactId>postgresql</groupId>  
            <version>8.4-701.jdbc3</version>  
            <optional>true</optional>  
        </dependency>  
    </dependencies>  
</project>

依赖排除

Maven仓库

仓库指的是某个位置;该位置存放着maven项目依赖的第三方库或者插件(可统称为构件)。所有的maven项目都可以访问这个仓库,根据依赖的坐标在仓库中找到它们并使用它们

仓库的类型

  • 本地仓库
  • 远程仓库
    • 中央仓库
    • 私服
    • 其他公共库

本地仓库

当maven文件在执行编译或者测试的时候需要使用依赖的文件,它总是基于坐标使用本地仓库的依赖文件。

默认的情况下,不管是windows、macOS、linux,每个用户都会在自己的用户目录有一个.m2/repository/的仓库目录。

如果要自定义刻在~/.m2/settings/xml中设置本地仓库的地址

远程仓库

默认情况下本地仓库会被注释,也就是说默认的仓库是空的。这种情况就必须给maven配置一个可用的远程仓库,否则maven项目在构建的时候将无法下载依赖。

中央仓库

就是这样一个可以远程拉取依赖资源的地方,里面包含了世界上绝大多数流行开源的Java类库。

但是因为中央仓库访问速度很慢所以通常会使用阿里的maven远程仓库。

<repositories>
	<repository>
		<id>ali-maven</id>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		<releases>
			<enabled>true</enabled>
		</releases>
		<snapshots>
			<enabled>true</enabled>
			<updatePolicy>always</updatePolicy>
			<checksumPolicy>fail</checksumPolicy>
		</snapshots>
	</repository>
</repositories>
  1. repositories:可以包含一个或者多个repositorie元素,用来声明一个或者多个仓库
  2. id:仓库声明的唯一id,注意maven自带的中央仓库使用的id为central如果其他仓库也是用了该id将会覆盖中央仓库的配置
  3. url:指向仓库的地址
  4. releases和snapshots,用于控制maven对于发布版构建和快照版构建的下载权限
    1. enabled:为true是代表可以下载
    2. updatePolicy:用来配置maven从远处仓库检查和更新的频率
      1. daily默认每天一次
      2. never:从不检测
      3. always:每次构建时检测
      4. interval:表示每隔x分钟进行一次更新
    1. checksumPolicy:控制maven检测校验的策略。当maven在进行构建时报错;
      1. warn:默认值,在执行构建的时候输出警告信息
      2. fail:校验出错时直接构建失败
      3. ignore:让maven忽略校验

搭建自己的远程仓库

搭建自己的远程仓库能够方便部署自己的项目构建至远程仓库,方便其他团队成员使用,要上传构建就需要distributionManagement元素;

<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>
  1. repository:表示当前发布版本构件的仓库
  2. snapshotRepository:表示当前构件快照版本的仓库

两个元素都需要配置id、name、url。id为仓库的唯一表示,name方便阅读,url为仓库的位置。

配置好了以后使用命令 mvn clean deploy,maven就会将项目部署到对应的远程仓库。

仓库镜像

如果仓库X可以提供仓库Y所有的存储内容则认为X仓库是Y仓库的镜像。可以在setting.xml中添加镜像

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

其中mirrorOf元素的可选项有

  • *:匹配所有远程仓库
  • external:*:匹配所有远程仓库,除了本机上的远程仓库
  • rep1,rep2:匹配仓库rep1、rep2,使用逗号分割多个远程仓库
  • *,!rep1:匹配所有远程仓库除了rep1仓库