maven仓库公司会给吗,maven是怎么判断包在本地仓库和远程仓库哪个是新的
maven仓库公司会给吗,maven是怎么判断包在本地仓库和远程仓库哪个是新的详细介绍
本文目录一览: 公司maven一般怎么用
Maven 是一个项目管理工具,包含了一个项目对象模型(POM : Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System )和用来运行定义在生命周期阶段中插件目标的逻辑。Maven 仓库有三种类型:本地(local):Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。中央(central):中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。远程(remote):开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
什么是Maven仓库
Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。
此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。
你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。
简言之,Maven仓库能帮助我们管理构件(主要是JAR)。
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。得益于 Maven 的坐标机制,任何 Maven项目使用任何一个构件的方式都是完全相同的,Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
对于Maven来说,仓库分为两类:本地仓库和远程仓库。
Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。
1、在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等。每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复。
2、永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难。你需要将大量的jar文件提交到代码库里,可是版本管理工具在处理二进制文件方面并不出色。
3、Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。
4、此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。
如何向maven本地仓库添加jar包?
原则上Maven的设计是不需要这么做的,因为pom.xml中依赖的jar包会自动实现从中央仓库下载到本地仓库。但是公司设计了一个setting,如果本地仓库没有,就去setting指定的url中下载jar包,如果还没有就报错。\x0d\x0a考虑到setting中url的jar包比较老,如果需要用最新的,则需要将jar包手动下载到本地仓库。\x0d\x0a\x0d\x0a比如我下载了\x0d\x0alucene-queryparser-4.6.1.jar\x0d\x0a\x0d\x0a怎么添加到本地仓库呢?\x0d\x0a步骤:\x0d\x0a1.cmd命令进入该jar包所在路径\x0d\x0a2.执行命令\x0d\x0amvn install:install-file -Dfile=lucene-queryparser-4.6.1.jar -DgroupId=org.apache.lucene -DartifactId=lucene-queryparser -Dversion=4.6.1 -Dpackaging=jar\x0d\x0a(不同的jar包相对应替换对应部分)\x0d\x0a\x0d\x0a另外我尝试了下面的方法,发现不行:\x0d\x0a直接写一个空的pom,里头包含对所需要jar包的依赖,通过这种方式希望将jar包下载到本地仓库。但是应用代码中没用到,maven命令没有下载这个jar包到本地仓库。\x0d\x0a\x0d\x0a补充,-DgroupId和-DartifactId的作用其实是指定了这个jar包的安装在repository的安装路径,只是用来告诉项目去这个路径下寻找这个名称的jar包。比如:\x0d\x0amvn install:install-file -Dfile=freemarker-2.3.13.jar -DgroupId=freemarker -DartifactId=freemarker -Dversion=2.3.13 -Dpackaging=jar\x0d\x0a\x0d\x0a就是安装到了repository\freemarker\freemarker\2.3.13目录下,如果在dependency的依赖里也这么写的话,就可以到对应的目录去寻找。\x0d\x0a对于maven中存在classifier的,例如\x0d\x0a\x0d\x0a org.apache.hadoop\x0d\x0a hadoop-hdfs\x0d\x0a 2.2.0\x0d\x0a tests\x0d\x0a \x0d\x0a\x0d\x0a就加一个-D参数就可以了,如下:\x0d\x0amvn install:install-file -Dfile=hadoop-hdfs-2.2.0-tests.jar -DgroupId=org.apache.hadoop -DartifactId=hadoop-hdfs -Dversion=2.2.0 -Dclassifier=tests -Dpackaging=jar
nexus与maven本地仓库
情况很多,我举一下几种常见情况: 如果下载失败一次的话,会生成一个文件在 .update 文件你的本地仓库里面,告诉maven今天之内不要再重复下载这个文件,如果是这种情况,请到 本地仓库手动把这个jar所属的包文件夹...
上面所说的仓库是指你电脑本地的jar包存在路径.maven项目直接从本地库中引入jar到项目中,如果maven中需要引入的jar你本地库中没有就会到你指定的nexus(管理maven所依赖的jar的服务器)服务器中去下载到本地库中然后引入到项目中
java如何使用自己的maven本地仓库详解
步骤如下:
1、下载maven的bin,在apache官方网站可以下载。
2、下载下来之后,解压,找个路径放进去, 把bin的位置设在环境变量里,新建环境变量MAVEN_HOME。
3、在PATH里加入maven的bin的路径。
4、配置完毕后,在Windows命令提示符下,输入mvn -v测试一下。
5、配置成功后开始在Eclipse中配置Maven,点击Eclipse菜单栏Help->Eclipse Marketplace搜索关键字maven到插件Maven Integration for Eclipse 并点击安装即可。
6、安装完毕后,点击重启Eclipse。
7、重启后,为了使得Eclipse中安装的Maven插件,同windows中安装的那个相同,需要让eclipse中的maven重新定位一下,点击Window -> Preference -> Maven -> Installation -> Add进行设置。
9、设置成功即安装完成。
Github 的Java项目发布到 Maven 中央仓库
把项目发布到 Maven 分三步:
1.???在sonatype中创建issue
2.? 使用gpg生成秘钥
3.?配置Maven进行deploy和release
? ? ? ? ? ? Sonatype是一个通过Nexus对开源项目提供托管服务的网站。你可以通过它发布项目的快照(snapshot)或者稳定版本(release)到Maven中央仓库。我们只需要注册一个Sonatype的账号,新建一个issue,然后在项目的pom文件中进行配置即可。
1.? Sonatype 注册帐户
? ?? https://issues.sonatype.org/secure/Signup!default.jspa
? ??
录入以上信息,然后 Sign up, 出现以下页面:
注册成功,然后登录。
2. 创建issue
1. 登录成功后,选择 创建一个问题,如下图:
? ?? 2. 创建问题
? ? 3.? 按要求把问题的详细信息填写清清楚楚,如下图:
? ? 4. 点新建,创建一个问题,如下图:
? ? 5.? 问题提交完成, 你会收到一封邮件:
? ??
3.? 等待审核
? ? 等 解决结果是 已解决就可以了。
等待中。
maven是怎么判断包在本地仓库和远程仓库哪个是新的
maven对构件的更新判断基本上是两种,一种是稳定版本,一种是maven特有的SNAPSHOT版本。
稳定版本很好判断,直接根据maven构件的坐标体系就能够获得。先从本地仓库中找,如果本地仓库没有,就从pom.xml和setting.xml配置的远程仓库来找。
SNAPSHOT版本的判断比较麻烦,基本步骤如下:
假设我在2014年08月22日09时40分52秒在我自己的电脑上使用 “mvn install” 构建了“com.mycompany.demo:test:1.0-SNAPSHOT”。
那么Maven会在本地仓库目录“~/.m2/com/mycompany/demo/test/1.0-SNAPSHOT/”下生成文件“maven-metadata-local.xml”,内容如下:
com.mycompany.demo
test
1.0-SNAPSHOT
true
20138002
jar
1.0-SNAPSHOT
20138002
pom
1.0-SNAPSHOT
20138002
十点钟的时候,其他同事更新了com.mycompany.demo:test:1.0-SNAPSHOT的内容,并通过 "mvn deploy" 发布到了公司的Maven服务器上。
公司Maven服务器上产生了文件:
test-1.0-20140822.100021-1.jar
test-1.0-20140822.100021-1.pom
并更新了maven-metadata.xml,内容如下:
com.mycompany.demo
test
1.0-SNAPSHOT
20140822.100021
34
20138001
jar
1.0-20140822.100021-1
20138001
pom
1.0-20140822.100021-1
20138008
在这期间我的电脑上没有发生过任何关于test的构建。
某一天,我需要构建一个依赖于test的项目,于是我运行了mvn package来打包。
这个时候,maven做了什么呢(背景:我通过配置镜像,使我本地Maven的任何资源都是从公司的Maven服务器下载的)?
Step1:从公司的Maven服务器上下载maven-metadata.xml,重命名为“maven-metadata-
.xml”,并保存到本地仓库相应目录。
Step2:比较maven-metadata-local.xml与maven-metadata-
.xml中的lastUpdated时间戳的值。
如果maven-metadata-local.xml中的时间戳比较大,则终止。
如果maven-metadata-
.xml中的时间戳较大,则从公司Maven服务器上下载最新版本。
即:testu-1.0.1-20130407.081828-34.jar。这个过程分两步:(1)下载test-
1.0-20140822.100021-1.jar到本地Maven仓库。(2)将test-1.0-20140822.100021-1.jar复制
一份,覆盖掉原先的test-1.0-SNAPSHOT.jar。也就是说,如果Maven从远程仓库下载了最新的SNAPSHOT发布包的话,那么最新
的待时间戳的包和xxx-SNAPSHOT包是完全一样的。
Maven依赖的是本地工程还是仓库jar包
相信大家都碰见过 maven 配置的依赖或者是 jar 包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看 maven 依赖的文件的时候,就能直接查看到源码。
一、本地工程依赖
举个例子,其架构如下所示(以下均使用eclipse中m2eclipse插件进行演示)——
此时,这里依赖的“dependency-to-hello”指代的是eclipse工作空间中的工程,这样,我们直接源码依赖的便是工作空间里的源码,这样很方便,也是我们需要的。会注意到,所依赖的“dependency-to-hello”工程,并没有显示其路径,也就是默认的工作空间的地址。
那么,什么时候maven依赖的是仓库(本地仓库或远程仓库)中的jar包呢?
二、(本地/远程)仓库jar包依赖
很简单的方法之一,直接把“dependency-to-hello”工程关闭掉(close project),这样,就得到这样一个视图——
会看到,此时maven依赖的正是对应“dependency-to-hello”工程的jar文件,并且,后面的路径显示是从maven仓库里面取的。
三、工程依赖及仓库依赖的转换
OK,我们现在还原之,我们将工程“dependency-to-hello”打开,会看到对应的maven依赖又变回原来的工程依赖了。
需要说的是,当重新打开工程“dependency-to-hello”的时候,hello工程并没有出现红色感叹号,也就是无须做“update dependencies”等的更新maven依赖等操作。
从这里,我们就能够看出来——m2eclipse首先查看是否能够从本地工程库中得到对应的maven依赖,如何存在,则将本地工程依赖进来;如何不存在,则从本地仓库/远程仓库中加载解析对应的jar包依赖。
maven本地仓库什么时候创建
在以前使用 Ant 的时候,我们会建立一个 lib 目录在存放我们的 jar 包,比如项目所依赖的第三方包,每建立一个项目都要建立一个 lib ,不停的做 copy 工作,不仅是对于磁盘的浪费,而且也造成了版本管理上的麻烦。而且我们还需要通过提交到 svn 上来对 lib 进行管理,但是 svn 对于这种二进制文件的管理并不出色。
Maven 仓库的初中就是为了解决这个问题,是所有常用的第三方包的集中营。这样所有的 Maven 项目就可以从这个仓库中获取所需要的资源, Maven 仓库中对 jar 通过 Group Id, Atifact Id, version 来管理 ,所以 Maven 项目可以很方便的进行依赖管理。你不需要自己来管理这个庞大的资源仓库,当然你可以创建一个公司层面的仓库管理器,这个我在这个章节的后面会介绍。
Maven 仓库的两个概念:本地仓库和远程仓库
本地仓库是远程仓库的一个缓冲和子集,当你构建 Maven 项目的时候,首先会从本地仓库查找资源,如果没有,那么 Maven 会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果 你所需要的 jar 包版本在本地仓库没有,而且也不存在于远程仓库, Maven 在构建的时候会报错,这种情况可能发生在有些 jar 包的新版本没有在 Maven 仓库中及时更新。
Maven 缺省的本地仓库地址为 ${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。当然你可以通过修改 ${user.home}/.m2/settings.xml 配置这个地址:
Xml代码
...
D:/java/repository
...
如果你想让所有的用户使用统一的配置那么你可以修改 Maven 主目录下的 setting.xml:
${M2_HOME}/conf/setting.xml
还可以通过在运行时指定目录,但是并不推荐这么做:
mvn clean install -Dmaven.repo.local=/home/juven/myrepo/
当我们创建一个简单的 Maven 项目后 ( 只需要在 pom.xml 配置好依赖 ) ,运行 mvn clean install 就可以把项目构建好,不需要我们手工下载任何 jar ,这全靠中央仓库的存在,它会自动从仓库下载。这个仓库的定义是在 ${M2_HOME}/lib/maven-2.0.10-uber.jar 里面。你可以在里面找到 /org/apache/maven/project/pom-4.0.0.xml 这个文件,在这个文件里面定义了中央仓库的地址:
central
Maven Repository Switchboard
default
http //repo1 maven org/maven2
false
在 POM 中配置远程仓库
下面我介绍下如何在 pom.xml 里面配置远程仓库,我们需要在什么时候配置远程仓库呢?当你连接中央仓库的速度比较慢时,或者你为你的公司搭建了自己的仓库,比如 Nexus 仓库管理 ( 后面我会介绍 ) ,又或者你苏需要的 jar 存在另外一个公共仓库,比如我们配置一个国内的镜像地址:
...
maven-net-cn
Maven China Mirror
http /maven net cn/content/groups/public/
true
false
maven-net-cn
Maven China Mirror
http //maven net cn/content/groups/public/
true
false
...
这里我们可以看到 ,允许配置多个 repository 和 plugin repository , < releases>
true
告诉 Maven 可以从这个仓库下载 releases 版本的构件,而
false
告诉 Maven 不要从这个仓库下载 snapshot 版本的构件 , 之所以不让你从这个仓库下载 snapshot 版本,是因为这些版本是不稳定的,但是 snapshot 版本在我们内部项目开发的时候可是作用巨大,后面的问文章我会讨论这个问题。 至于
,这是配置 Maven 从什么地方下载插件构件, Maven 的所有行为都是通过插件来完成的,其内部配置与 < repository > 类似,这里就不多说了。
尽管 pom.xml 中可以方便的哦配置中央仓库,但是我并不推荐大家这么做,尤其是在大的公司中,因为一个公司会有很多的项目,如果每个项目都这样配置,那么又开始做重复的 copy 工作了,如何解决呢,我们往下走
在 settings.xml 中配置远程仓库
P om.xml 的作用范围是一个项目,一个公司不可能只做一个项目,那么为了避免重复配置,那么我们需要把一些公共信息配置在 setting.xml 中。但是 setting.xml 中并不支持
及
,为了解决这个问题我们使用 profile :
...
myProfiel
<!--—在这里加入 及
-->
myProfiel
...
这里通过
元素来激活这个 profile ,这样我们就可以全局的使用这个配置,不再需要为每个 POM 做重复的配置了。
在实际的操作过程中,这里我们最好不要配置远程仓库,最好能够通过 nexus 建立公司或者组织自己的仓库,然后这把把地址指向自己的仓库,后面我会介绍为什么要这么做,怎么做。
配置镜像
如果你想覆盖中央仓库的默认地址,那么这里我们就会使用的镜像了,还在 setting.xml 里面配置:
...
maven-net-cn
Maven China Mirror
http //maven net cn/content/groups/public/
central
...
这里解释一下
, 表示只为 central 仓库做镜像,如果想为所有的仓库做镜像那么可以改为:
*
如果你看到这里,请先不要着急,实际的项目经验告诉我,只是这些还不够,我们需要更快捷和高效的管理:
利用 Nexus 来构建企业级 Maven 仓库
Nex u s 简介
Nexus 是 Maven 仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个非常有用的功能就是可以通过项目的 SNAPSHOT 版本管理,来进行模块间的高效依赖开发,下面会一一描述。
虽然你可以通过中央仓库来获取你所需要的 jar 包,但是现实往往是存在很多问题:
网速慢,你可能需要花很长的时间来下载你所需要的 jar
如果你的公司很大,有几百甚至几千人再用 Maven ,那么这些人都去通过中央仓库来获取 jar ,那么这是一个很大的资源浪费
如果存在模块之间的依赖开发,你的 snapshot 版本是不能够被你的伙伴很方便的获取。
在实际开发过程中,有些 jar 的版本可能在中央仓库里面不存在,或者更新不及时 ,你是获取不到这个 jar 的。
所有以上问题,通过 Nexus 这个日益流行的仓库管理器可以轻松的解决。
这个仓库是本地的,下载的速度是从远程下载不可比的。
可以为你公司所有的 Maven 使用者服务,可以进行统一管理
后面我会介绍如何通过 nexus 来进行存在模块依赖的项目的开发
你可以添加自己的第三方包。