在之前使用Ant的时候,咱们会创建一个lib目录在存放咱们的jar包,好比项目所依赖的第三方包,每创建一个项目都要创建一个lib,不停的作copy工做,不只是对于磁盘的浪费,并且也形成了版本管理上的麻烦。并且咱们还须要经过提交到svn上来对lib进行管理,可是svn对于这种二进制文件的管理并不出色。 java
Maven仓库的初中就是为了解决这个问题,是全部经常使用的第三方包的集中营。这样全部的Maven项目就能够从这个仓库中获取所须要的资源,Maven仓库中对jar经过Group Id, Atifact Id, version 来管理,因此Maven项目能够很方便的进行依赖管理。你不须要本身来管理这个庞大的资源仓库,固然你能够建立一个公司层面的仓库管理器,这个我在这个章节的后面会介绍。 linux
Maven 仓库的两个概念:本地仓库和远程仓库 web
本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,若是没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不须要从远程下载了。若是你所须要的jar包版本在本地仓库没有,并且也不存在于远程仓库,Maven在构建的时候会报错,这种状况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。 macos
Maven缺省的本地仓库地址为${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。固然你能够经过修改${user.home}/.m2/settings.xml 配置这个地址: apache
Xml代码 windows
若是你想让全部的用户使用统一的配置那么你能够修改Maven主目录下的setting.xml: 浏览器
${M2_HOME}/conf/setting.xml tomcat
还能够经过在运行时指定目录,可是并不推荐这么作: 安全
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这个文件,在这个文件里面定义了中央仓库的地址:
在 POM 中配置远程仓库
下面我介绍下如何在pom.xml里面配置远程仓库,咱们须要在何时配置远程仓库呢?当你链接中央仓库的速度比较慢时,或者你为你的公司搭建了本身的仓库,好比Nexus仓库管理(后面我会介绍),又或者你苏须要的jar存在另一个公共仓库,好比咱们配置一个国内的镜像地址:
这里咱们能够看到,容许配置多个repository和 plugin repository,<releases><enabled>true</enabled></releases>告诉Maven能够从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件,之因此不让你从这个仓库下载snapshot版本,是由于这些版本是不稳定的,可是snapshot版本在咱们内部项目开发的时候但是做用巨大,后面的问文章我会讨论这个问题。至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件,Maven的全部行为都是经过插件来完成的,其内部配置与<repository>相似,这里就很少说了。
尽管pom.xml中能够方便的哦配置中央仓库,可是我并不推荐你们这么作,尤为是在大的公司中,由于一个公司会有不少的项目,若是每一个项目都这样配置,那么又开始作重复的copy工做了,如何解决呢,咱们往下走
在 settings.xml 中配置远程仓库
Pom.xml的做用范围是一个项目,一个公司不可能只作一个项目,那么为了不重复配置,那么咱们须要把一些公共信息配置在setting.xml中。可是setting.xml中并不支持<repositories>及<pluginRepositories>,为了解决这个问题咱们使用profile:
这里经过<activeProfile>元素来激活这个profile,这样咱们就能够全局的使用这个配置,再也不须要为每一个POM作重复的配置了。
在实际的操做过程当中,这里咱们最好不要配置远程仓库,最好可以经过nexus创建公司或者组织本身的仓库,而后这把把地址指向本身的仓库,后面我会介绍为何要这么作,怎么作。
配置镜像
若是你想覆盖中央仓库的默认地址,那么这里咱们就会使用的镜像了,还在setting.xml里面配置:
这里解释一下<mirrorOf>,表示只为central仓库作镜像,若是想为全部的仓库作镜像那么能够改成:<mirrorOf>*</mirrorOf>
若是你看到这里,请先不要着急,实际的项目经验告诉我,只是这些还不够,咱们须要更快捷和高效的管理:
Nex u s 简介
Nexus是Maven仓库管理器,用来搭建一个本地仓库服务器,这样作的好处是便于管理,节省网络资源,速度快,还有一个很是有用的功能就是能够经过项目的SNAPSHOT版本管理,来进行模块间的高效依赖开发,下面会一一描述。
虽然你能够经过中央仓库来获取你所须要的jar包,可是现实每每是存在不少问题:
全部以上问题,经过Nexus这个日益流行的仓库管理器能够轻松的解决。
安装 Nexus
咱们从http://nexus.sonatype.org/downloads/ 来获取最新版本,目前最新版本为1.3.4
Nexus提供了两种安装方式,一种是内嵌Jetty的bundle,只要你有JRE就能直接运行。第二种方式是WAR,你只须简单的将其发布到web容器中便可使用。
1)Bundle 方式安装
解压nexus-webapp-1.3. 4 -bundle.zip 至任意目录,如D:/ tools ,转到目录D:/ tools/nexus-webapp-1.3. 4/bin/jsw/windows-x86-32 ,运行Nexus.bat ,若是你是在linux下安装,那么就下载nexus-webapp-1.3. 4 -bundle. tar .gz, 解压后转到${NEXUS_HOME}/ nexus-webapp-1.3.3/bin/jsw/linux-x86-32,它还支持solaris,macos等操做系统。当你看到“Started SelectChannelConnector@0.0.0.0:8081”以后,说明Nexus启动成功了,而后打开浏览器,访问http://127.0.0.1:8081/nexus,经过admin的账号(admin)和密码(admin123)登陆你会看到以下的页面:
若是有新版本发布,会有提示在默认页面上。
这里,能够管理仓库,配置Nexus系统,管理任务,管理用户,角色,权限,查看系统的RSS源,管理及查看系统日志,等等。
War 方式安装
你能够同过war的方式以web应用的形式发布到你的应用服务器,好比tomcat。你所要作的就是下载war版本的文件,而后放到应用服务器的发布目录便可,这里就很少讲了。
到此咱们已经安装好Nexus,下面我来介绍下一些咱们经常使用的功能和使用:
配置 中央仓库
先看一下界面:
在左边菜单栏里选择Repositories,而后会出现右边的画面,右边上半部分是列出来的repository,黑体字是类型为group的repository. 这里简单介绍下几种repository的类型:
Maven central是Maven的中央仓库,点击它并选择configuration标签栏,咱们会看到下面的页面:
这里有几个项目是咱们可能会常常用到的:
添加代理仓库
Maven central是一个比较大的代理仓库,若是你须要添加的一个代理仓库,那么能够在点击左边惨淡栏里面的Repositories,而后右边的页面点击add -> add proxy repository, 以后出现如下页面:
填写相关信息保存便可。一般状况下,使用预设的代理仓库已经可以知足大部分项目的需求了, 只有在特殊需求的状况下才会参加代理仓库.
管理本地仓库
咱们前面讲到类型为hosted的为本地仓库,Nexus预约义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是作什么用的:
Maven 仓库组
仓库组的概念是Maven没有的,经过前面介绍能够了解到, 咱们能够创建多个proxy代理仓库,hosted本地仓库, 若是没有仓库组的概念,咱们若是须要引用这些仓库的是时候须要一一加入到咱们的setting.xml里面去, 有了仓库的组的概念, 咱们只须要作一次引用就能够了,把咱们须要的仓库加入到仓库组便可.像这样:
<repositories>
<repository>
<id>nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Nexus中预设了2个仓库组,public repositories和public snapshot repositories. 如图:
这个仓库组默认包含本地仓库Releases, snapshots, 3rd party和代理仓库Maven Central. 你能够在Configuration配置页添加仓库到这个仓库组. 若是须要你还能够建立一个仓库组,如图:
点击 Add->Repository Group
出现New Repository Group界面后,填入ID, name 等相关信息, 在右边Available Repositories 栏里能够选择你要添加的仓库到你新建的仓库组.
经过 Nexus 搜索构件
在咱们实际使用构件的过程当中一般遇到一个问题,有时候我牢牢知道我所须要的构建的大体名字,并不知道全称或group id, 这是件很是头疼的事情. Nexus基于Nexus indexer的搜索功能帮咱们解决了这个问题.
要是用搜索功能, 必需要有索引文件, Nexus默认是不创建索引文件的,由于像中央仓库这样的索引文件的创建须要耗费比较大的网络资源,仅索引文件就要几十兆. 要开启中央仓库的索引文件下载功能须要在Maven Central的配置页面, 把Download Remote Indexes选择true. 如图:
这样设置之后, Nexus会自动从远程中央仓库下载索引文件, 为了检验索引文件自动下载是否生效,能够却换到Browse:
若是出现先以上文件夹,那说明索引文件已经创建.
下面我试一下搜索功能, 在左边菜单栏里面有个Artifact Search, 在输入框里面输入你想要搜索的构件名字,好比: testing, 那么查询结果以下:
这是模糊查询的结果,固然若是你知道更多信息,好比版本号等,你可使用高级搜索,点击高级搜索后,右边界面会提供集中搜索方式:keyword, classname, GAV, checksum
好比咱们这里选择GAV模式, 并且我只知道artiface name : testng和版本号5.8, 其余的我不知道, 那么就在artifact 和 version处分别输入testng 和 5.8 , 搜索结果以下:
你若是你不知道知道构件的名称, 只知道classname, 那么你也能够经过class name 的方式搜索,这里就再也不赘述
当你选择一项搜索结果,在页面的下方会出现这个构件的详细信息, 而且会列出这个构件的Maven依赖配置, 你能够直接拷贝到你的pom文件中使用,这是个很是实用的功能:
在 Maven 中使用 Nexus
到此为止咱们介绍了如何安装和使用Nexus以及其基本配置, 下面咱们介绍下如何让Maven来使用Nexus本地仓库用来替代使用远程仓库. 在Maven使用Nexus本地仓库只需稍做配置, 在settings.xml中加入如下代码:
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
这里配置了repository和pluginRepository, Maven在使用第三方构件和插件时是分开来配置的,因此若是咱们也但愿插件的下载也经过咱们的本地仓库来下载,那么咱们就须要配置pluginRepository.
红色字体部分就是咱们以前安装的Nexus的地址, 这个地址能够是大家公司局域网内部的一台仓库服务器.
<releases> <enabled>true</enabled></releases>这个标签的做用是设定是否容许下载
release版本的载构件, 一样snapshots标签能够设定是否容许下载snapshot版本的构件.
一般,咱们不建议下载snapshot版本的构件,由于它是不稳定的版本, 除非你有特殊的需
求.
构件部署
有些时候咱们须要部署构件到Nexus的3rd party, 好比咱们在中央仓库找不到咱们须要的构件, 咱们能够经过Nexus的UI来上传构件:
点击左边菜单栏的 Repositories, 而后点击右边界面的3rd party, 选择界面下方的Artifact Upload, 这个时候出现如下界面:
上传构件须要两个步骤,一个是定义文件的上传,再就是构件的实体文件.
第一部分定义文件能够是POM文件, 这也是比较推荐的方式, 若是没有pom文件,能够
选择以参数的形式输入.
第二部分是上传构件的实体文件,这里简单说一下Classifier和Extension, 这两个都是选
填相, Classifier用来区别同功能的构件用于不一样的场景, 好比这个构件是分别针对JDK14
和JDK15作了2个功能同样的Jar, 这个时候你就须要指定这个构件的Classifier为JDK14
仍是JDK15. Extension是指扩展名,若是不提供,那么会自动取这个构件的Packaging Type
做为扩展名, 好比 ear, jar, war 等等. (Packaging Type是在第一步中经过pom文件或者手
工输入获得的)
刚才说了3rd party的部署, 关于releases 和 snapshots的UI部署也是同样的操做过程.
咱们以前也讲过, 这里的releases和snapshots是用来部署咱们本身的项目构件的, 经过
UI部署是能够,可是不是最高效的, 咱们能够经过配置Maven来自动部署咱们的项目构
件,这也是咱们创建本身的仓库的一个很是重要的缘由, 下面就让咱们看看如何配置:
首先须要在POM文件中加入如下代码:
这里配置,让Maven知道当我要发布release版本或者snapshot版本是须要发布到哪一个地址.
而后咱们须要在setting.xml里面配置一下Nexus的账号和密码:
到此为止, 咱们就能够经过命令mvn deploy或者经过IDE的可视化界面点击deploy来发布咱们项目到本地仓库了. 经过这种方式咱们能够很方便的进行模块间的依赖开发, 在后面的文章中我会详细介绍如何经过snapshot来让咱们的依赖开发变得简单.
本文介绍了Maven仓库, 如何经过Nexus创建本身本地仓库, 经过和远程仓库的比较, 咱们知道Nexus给我带来不少方便之处, 方便咱们管理, 方便咱们的项目构件部署, 项目的依赖开发等. 还在等什么, 建立你本身的仓库吧.
--------------------------------------------------
补充提示:
1、发现配置后,下载构件抛异常。
0-10-3 下午05时09分43秒: Build error for /com.newyulong.iptv.domain.entity/pom.xml; org.apache.maven.plugin.PluginResolutionException: Plugin org.apache.maven.plugins:maven-resources-plugin:2.4.1 or one of its dependencies could not be resolved: Missing:
----------
1) org.apache.maven.plugins:maven-resources-plugin:maven-plugin:2.4.1
Try downloading the file manually from the project website.
Then, install it using the command:
mvn install:install-file -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Dversion=2.4.1 -Dpackaging=maven-plugin -Dfile=/path/to/file
Alternatively, if you host your own repository you can deploy the file there:
mvn deploy:deploy-file -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Dversion=2.4.1 -Dpackaging=maven-plugin -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
----------
1 required artifact is missing.
for artifact:
org.apache.maven.plugins:maven-resources-plugin:maven-plugin:2.4.1
from the specified remote repositories:
Nexus (http://localhost:8181/nexus/content/groups/public , releases=true, snapshots=false)
2、主要缘由是配置nexus里面的 Public Repositories 顺序和条件出错,致使不能下载构件。
这个是正确的配置顺序,左边的是正在使用的定义好的仓库组,一边是可选的。下载构件的顺序是先在本地releases找有没有,再snapshots,再3rd party,最后是本地机子都没有构件就到远程(外网)提供的网站下载构件。
好多公司处于安全考虑,用代理上网,而nexus 常常须要往maven repository中心下载东西,因此须要给nexus设置代理。 开始没找到地方,后来发现能够从nexus后台管理器界面上直接设置,地方很隐蔽:
登录后进入管理页面,从左边菜单栏选择Server 打开右边tab页,发现仍是找不到,别着急,仔细找会发现有行: default http proxy settings 前面有个checkbox 未勾选, 速度勾选之,立刻出现了您熟悉的 proxy host,proxy port , username , passowrd. okay 代理设置完成,如今nexus能经过互联网从maven repository中心下载东西了!
-----------------------------------------------------
linux 下安装部署 nexus
1.nexus的下载地址
http://nexus.sonatype.org/downloads/
解压后获得2个文件:
nexus-oss-webapp-1.8.0 -- 包含了nexus的运行环境和应用程序
sonatype-work --包含了你本身的配置和数据
2.启动nexus
二、 在这个目录下包含了一个文件夹和三个文件:lib、nexus、platform和wrapper,其中nexus就是启动命令。Linux代码一、启动nexus前的操做:nexus支持32位和64位,若是选择64位的,请最好选择1.6的jdk,由于1.4的jdk不支持64位。选择64位,具体命令: #cd nexus-oss-webapp-1.8.0/bin/jsw/linux-x86-64/ # java -version java version "1.4.2_12" (提示当前的jdk版本是jdk1.4) # export PATH=/opt/jdk1.6.0_20/bin:$PATH (指向引用1.6的jdk)