当前位置: 首页 > news >正文

maven的基本原理和使用

一、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











转载于:https://www.cnblogs.com/kangsir/p/6653237.html

相关文章:

  • cocos2d-x -Lua 字符串
  • [系统资源攻略]IO第一篇-磁盘IO,内核IO概念
  • 深入理解CSS中的margin
  • 有哪些話让你看了一遍就再也没有忘记?
  • 搭建nlp_server服务器
  • 修身
  • android classloader双亲委托模式
  • 手机号中间四位加星号
  • UISearchBar使用及修改样式
  • 关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
  • Android 高德地图入门详解
  • JavaScript操作符
  • Runtime学习笔记
  • windows 下 TCP 端口转发
  • 2017大数据标准化论坛发布了第一批大数据系统测试结果,阿里云数加获得了大数据系统测试证书。...
  • 03Go 类型总结
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ComponentOne 2017 V2版本正式发布
  • HTTP那些事
  • JAVA之继承和多态
  • JS笔记四:作用域、变量(函数)提升
  • SpringCloud集成分布式事务LCN (一)
  • v-if和v-for连用出现的问题
  • windows下mongoDB的环境配置
  • 来,膜拜下android roadmap,强大的执行力
  • 驱动程序原理
  • 深度解析利用ES6进行Promise封装总结
  • 深入浅出webpack学习(1)--核心概念
  • 使用 Docker 部署 Spring Boot项目
  • 学习HTTP相关知识笔记
  • ​如何防止网络攻击?
  • (175)FPGA门控时钟技术
  • (vue)页面文件上传获取:action地址
  • (第27天)Oracle 数据泵转换分区表
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (区间dp) (经典例题) 石子合并
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转载)从 Java 代码到 Java 堆
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net中我喜欢的两种验证码
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [20181219]script使用小技巧.txt
  • [20190113]四校联考
  • [4.9福建四校联考]
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [Apio2012]dispatching 左偏树
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle