一、Maven中央存储库

当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载。首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默认的 Maven 中央存储库  http://search.maven.org/  查找下载。

在Maven中,当你声明的库不存在于本地存储库中,也没有不存在于Maven中心储存库,该过程将停止并将错误消息输出到 Maven 控制台。



二、添加远程仓库

默认情况下,Maven从Maven中央仓库下载所有依赖关系。但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到。

1. Java.net资源库

添加Java.net远程仓库的详细信息在“pom.xml”文件。

pom.xml

<project ...>
<repositories>
<repository>
<id>java.net</id>
<url>https://maven.java.net/content/repositories/public/</url>
</repository>
</repositories>
</project>

2. JBoss Maven存储库

添加JBoss远程仓库的详细信息在 “pom.xml” 文件中。

pom.xml

<project ...>
<repositories>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
</project>

现在,Maven的依赖库查询顺序更改为:

在 Maven 本地资源库中搜索,如果没有找到,进入下一步,否则退出。

在 Maven 中央存储库搜索,如果没有找到,进入下一步,否则退出。

在Maven的远程存储库搜索,如果没有找到,提示错误信息,否则退出。





三、定制库到Maven本地资源库

如果我们自己创建了一个自定义的jar ,而另一个 Maven 项目需要使用。或者我们需要的jar包没有maven的支持,这时我们可以将其加入本地仓库中。

例如,kaptcha,它是一个流行的第三方Java库,它被用来生成 “验证码” 的图片,以阻止垃圾邮件,但它不在 Maven 的中央仓库中。下面我们来安装“kaptcha”jar到Maven 的本地资源库。

1、mvn安装

首先下载jar包

下载地址:http://code.google.com/p/kaptcha/downloads/list 

然后添加到本地Maven库中命令如下。可根据自己情况修改对应文件路径。

mvn install:install-file -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=2.3.2 -Dfile=D:\kaptcha-2.3.jar -Dpackaging=jar -DgeneratePom=true





2、pom.xml中的配置

    <dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>

注意要和仓库中的groupId、artifactId和version保持一致。

3、完成

构建它,现在 “kaptcha” jar 能够从你的 Maven 本地存储库检索了。





四、pom.xml

如果使用过Ant都知道Ant是通过build.xml执行构建任务的,Maven中是通过pom.xml来执行任务。

POM,全名project object model,即项目对象模型,maven通过这个pom.xml描述一个项目的构建以及信息。下面是个具体的配置信息。

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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kang</groupId>
<artifactId>maven-web</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>maven-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>maven-web</finalName>
</build>
</project>

第一行指定了文档的XML版本和编码。

第二行即每个pom.xml的核心元素——project。

project下面有几个子元素,这几个子元素一般是每个项目都会使用到的:

1、modelVersion

这个元素指定了POM的版本,Maven2或者Maven3 都只能是4.0.0。

2、groupId 

这是项目组的ID,一般是com.公司组织名.项目名。

3、artifactId 

这是该项目在项目组中的ID,比如当前的项目是一个web应用,就可以叫做maven-web。

4、packaging

这个属性可以指明项目的类型。常用的是jar(普通java工程)和war(web工程)。当不定义packaging的时候,Maven 会使用默认值jar。

5、version 是项目的版本号,用于维护项目的升级和发布。

6、name 一般没有实际的用处,只是用于标识该项目。

比较重要的参数是 groupId、artifactId、version,这三个属性确定唯一的一个项目。







五、Maven如何管理jar包

我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可。

1、在pom.xml中配置依赖 

依赖可以声明如下:

<?xml version="1.0" encoding="UTF-8"?>
<project>
...
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>group-c</groupId>
<artifactId>excluded-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>

例如junit的依赖如下;

    <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

2、依赖标签详解

依赖会包含基本的groupId, artifactId,version等元素,根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个依赖。

每个依赖可以包含的元素:

groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

type: 依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。

scope: 依赖的范围。

optional: 标记依赖是否可选。

exclusions: 用来排除传递性依赖。

大部分依赖声明只包含基本坐标。

(1)scope详解

Maven在编译主代码的时候需要使用一套classpath,在编译和执行测试的时候会使用另一套classpath,实际运行项目的时候,又会使用一套classpath。

依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有以下几种依赖范围:

compile: 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。

test: 测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。

provided: 已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。

runtime: 运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

system: 系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。

import(Maven 2.0.9及以上): 导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。

(2)optional详解

首先来看依赖的传递性。

假如我们项目引入依赖spring-core,我们可以在Maven仓库中查找spring-core构件,而该构件包含了一个commons-logging依赖。如下:

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>

那么该依赖会传递到当前项目中,这就是依赖的传递性。

有时候我们不想让依赖传递,那么可配置该依赖为可选依赖,将元素optional设置为true即可。

<dependency>
<groupId>xxxxx</groupId>
<artifactId>xxxxxx</artifactId>
<version>xxxx</version>
</dependency>

这样的话,依赖该项目的其他项目将不会得到此依赖xxxxx的传递。

(3)exclusions详解

 当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖

比如上例中的项目,我们不想引入传递性依赖commons-logging,我们可以使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusions的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5.6</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

这样的话项目将不会引入依赖commons-logging。





六、在Eclipse中管理依赖

如图,在该项目的pom.xml中点击Dependency Hierarchy可以看到依赖树。

点击Dependencies可以添加新的依赖,点击选择一个依赖,点击remove可以删除,点击Add可以新增一个依赖。

如下图,搜素org.springframework(此处是从Maven中心仓库进行搜索),选择你想要的模块和版本,点击OK即可:

如果出现Index downloads are disabled, search results may be incomplete.的错误

解决方案:

1、Window --> Preferences-->Maven 勾选"Download repository index updates on startup"

2、Window ---> Show View---> Maven Repositories ---> Global Repositories

maven的基本原理和使用的更多相关文章

  1. (一)Maven初步了解与认识

    Apache Maven是一个软件项目管理的综合工具.基于项目对象模型(POM)的概念,提供了帮助管理构建.文档.报告.依赖.发布等方法,Maven简化和标准化项目建设过程.处理编译,分配,文档,团队 ...

  2. 项目开发之使用 maven

    本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...

  3. Maven使用笔记(三)Maven的工作原理

    概述 Maven是一个项目管理工具,他包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来运行定义生命周期阶段中插件目标的逻辑. Maven是基于约定优于配置的思想来管理代码 ...

  4. Maven(1)-安装和配置

    Maven(1)-安装和配置 一.本机必须安装好Jdk 二 .maven下载 http://maven.apache.org/download.cgi ,下载后把maven-bin解压到自己的目录即可 ...

  5. maven原理

    http://www.cnblogs.com/onlys/archive/2011/01/04/1925466.html 基本原理Maven的基本原理很简单,采用远程仓库和本地仓库以及一个类似buil ...

  6. (一)maven之——maven基础及本地仓库的配置

    一.初步了解maven Apache Maven是一个软件项目管理的综合工具.基于项目对象模型(POM)的概念,提供了帮助管理构建.文档.报告.依赖.发布等方法,Maven简化和标准化项目建设过程.处 ...

  7. java web开发入门九(Maven使用&idea创建maven项目)基于intellig idea

    Maven 1.解决的问题 jar包的依赖和管理:版本.依赖关系等 自动构建项目 2.maven介绍 1.Maven是什么? Apache Maven是一个软件项目管理的综合工具.基于项目对象模型(P ...

  8. java web开发入门汇总

    servlet 用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据.类似于.net的ashx技术. servlet生成的class文件存放在tomc ...

  9. JBoss 系列一 O O:Maven jBPM 6 集成演示样例

    概述 jBPM 6 中底层架构基于 Maven,所以我们能够非常easy的进行 Maven jBPM 6 集成演示样例,本文分三个部分: 基本原理介绍 Maven jBPM 6 集成 jBPM 6 中 ...

随机推荐

  1. net4:Panel动态添加控件及隐藏,Table动态创建表格

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. poj 2253(kruskal)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34968   Accepted: 11235 Descrip ...

  3. Java原来如此-随机数

    在Java中,生成随机数有两种方法.1是使用Random类.2是使用Math类中的random方法. 我们现在做个例子,比如生成20个0到10之间的随机数. 1.使用Random类的nextInt(n ...

  4. unity3d Resources.Load动态加载资源

    初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省 ...

  5. HTTP状态码之200和304

    HTTP状态码之200和304   HTTP状态码(HTTP Status Code)是一种表示网页服务器响应状态的三位数字编码.通过这些数字,可以简化状态的表达.状态码有几十种,其中首位数字为1-5 ...

  6. PyTorch学习笔记之初识word_embedding

    import torch import torch.nn as nn from torch.autograd import Variable word2id = {'hello': 0, 'world ...

  7. Java生成GUID的方法

    其实在Java上已经换了一个说法,叫做UUID,方法如下: java.util.UUID.randomUUID()

  8. Go -- pprof协程监控

    go中有pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一 ...

  9. linux安装开源邮件服务器iredmail的方法:docker

    直接安装的方法,参考网文,我不介绍.本文介绍的是快速的方法:docker 使用镜像源:https://hub.docker.com/r/lejmr/iredmail/,因为pull的数量最多 直接 d ...

  10. nyoj 135 取石子(二) 【NIM】

    取石子(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 小王喜欢与同事玩一些小游戏.今天他们选择了玩取石子. 游戏规则例如以下:共同拥有N堆石子.已知每堆中石子 ...