现在的位置: 首页 > 综合 > 正文

Maven仓库管理-Nexus

2012年06月25日 ⁄ 综合 ⁄ 共 8685字 ⁄ 字号 评论关闭

在以前使用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 配置这个地址:

<settings>    
  …    
  
<localRepository> D:/java/repository</localRepository>    
  …    
</settings>    


如果你想让所有的用户使用统一的配置那么你可以修改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 这个文件,在这个文件里面定义了中央仓库的地址:

<repositories>    
  
<repository>    
    
<id> central</id>    
    
<name> Maven Repository Switchboard</name>    
    
<layout> default</layout>    
    
<url> http://repo1.maven.org/maven2</url>    
    
<snapshots>    
      
<enabled> false</enabled>    
    
</snapshots>    
  
</repository>    
</repositories>  


 POM 中配置远程仓库

下面我介绍下如何在pom.xml里面配置远程仓库,我们需要在什么时候配置远程仓库呢?当你连接中央仓库的速度比较慢时,或者你为你的公司搭建了自己的仓库,比如Nexus仓库管理(后面我会介绍),又或者你苏需要的jar存在另外一个公共仓库,比如我们配置一个国内的镜像地址:


<project>    
…    
  
<repositories>    
    
<repository>    
      
<id> maven-net-cn</id>    
      
<name> Maven China Mirror</name>    
      
<url> http://maven.net.cn/content/groups/public/</url>    
      
<releases>    
        
<enabled> true</enabled>    
      
</releases>    
      
<snapshots>    
        
<enabled> false</enabled>    
      
</snapshots>    
    
</repository>    
  
</repositories>    
  
<pluginRepositories>    
    
<pluginRepository>    
      
<id> maven-net-cn</id>    
      
<name> Maven China Mirror</name>    
      
<url> http://maven.net.cn/content/groups/public/</url>    
      
<releases>    
        
<enabled> true</enabled>    
      
</releases>    
      
<snapshots>    
        
<enabled> false</enabled>    
      
</snapshots>         
    
</pluginRepository>    
  
</pluginRepositories>    
…    
</project>   


 

这里我们可以看到,允许配置多个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:

<settings>    
  …    
  
<profiles>    
    
<profile>    
      
<id> myProfiel</id>    
      
<!—在这里加入<repositories><pluginRepositories>–>   
    
</profile>    
  
</profiles>    
  
<activeProfiles>    
    
<activeProfile> myProfiel </activeProfile>    
  
</activeProfiles>    
  …    
</settings>    

 


这里通过<activeProfile>元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了。 


Maven Profiles 
Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值。有了profile,你就可以为不同的环境定制构建。profile可以在pom.xml中配置,并给定一个id。然后你就可以在运行Maven的时候使用的命令行标记告诉Maven运行特定profile中的目标。以下pom.xml使用production profile覆盖了默认的Compiler插件设置。 

在实际的操作过程中,这里我们最好不要配置远程仓库,最好能够通过nexus建立公司或者组织自己的仓库,然后这把把地址指向自己的仓库,后面我会介绍为什么要这么做,怎么做。

<profiles> 
   
<profile> 
     
<id>production</id> 
     
<build> 
       
<plugins> 
         
<plugin> 
           
<groupId>org.apache.maven.plugins</groupId> 
           
<artifactId>maven-compiler-plugin</artifactId> 
           
<configuration> 
             
<debug>false</debug> 
             
<optimize>true</optimize> 
           
</configuration> 
         
</plugin> 
       
</plugins> 
     
</build> 
   
</profile> 
</profiles>


要使用production profile来运行mvn install,你需要在命令行传入-Pproduction参数。要验证production profile覆盖了默认的Compiler插件配置,可以像这样以开启调试输出(-X) 的方式运行Maven。

如果你开始大量使用Maven profile,你会希望将profile从POM中分离,使用一个单独的文件如profiles.xml。你可以混合使用定义在pom.xml中和外部profiles.xml文件中的profile。只需要将profiles元素放到${basedir}目录下的profiles.xml文件中,然后照常运行Maven就可以。profiles.xml文件的大概内容如下

<profiles> 
    
<profile> 
      
<id>development</id> 
      
<build> 
        
<plugins> 
          
<plugin> 
            
<groupId>org.apache.maven.plugins</groupId> 
            
<artifactId>maven-compiler-plugin</artifactId> 
            
<configuration> 
              
<debug>true</debug> 
              
<optimize>false</optimize> 
            
</configuration> 
          
</plugin> 
        
</plugins> 
      
</build> 
    
</profile> 
    
<profile> 
      
<id>production</id> 
      
<build> 
        
<plugins> 
          
<plugin> 
            
<groupId>org.apache.maven.plugins</groupId> 
            
<artifactId>maven-compiler-plugin</artifactId> 
            
<configuration> 
              
<debug>false</debug> 
              
<optimize>true</optimize> 
            
</configuration> 
          
</plugin> 
        
</plugins> 
      
</build> 
    
</profile> 
</profiles>


settings profile可以应用到所有你使用Maven构建的项目。你可以在两个地方定义settings profile:定义在~/.m2/settings.xml中的用户特定settings profile,或者定义在${M2_HOME}/conf/settings.xml中的全局settings
profile。


配置镜像

如果你想覆盖中央仓库的默认地址,那么这里我们就会使用的镜像了,还在setting.xml里面配置:

<settings>    
…    
  
<mirrors>    
    
<mirror>    
      
<id> maven-net-cn</id>    
      
<name> Maven China Mirror</name>    
      
<url> http://maven.net.cn/content/groups/public/</url>    
      
<mirrorOf> central</mirrorOf>    
    
</mirror>    
  
</mirrors>    
…    
</settings>  

 



这里解释一下<mirrorOf>,表示只为central仓库做镜像,如果想为所有的仓库做镜像那么可以改为:<mirrorOf>*</mirrorOf>
如果你看到这里,请先不要着急,实际的项目经验告诉我,只是这些还不够,我们需要更快捷和高效的管理:

利用 Nexus 来构建企业级 Maven 仓库
Nexus是Maven仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个非常有用的功能就是可以通过项目的SNAPSHOT版本管理,来进行模块间的高效依赖开发,下面会一一描述。

虽然你可以通过中央仓库来获取你所需要的jar包,但是现实往往是存在很多问题:

  1. 网速慢,你可能需要花很长的时间来下载你所需要的jar
  2. 如果你的公司很大,有几百甚至几千人再用Maven,那么这些人都去通过中央仓库来获取jar,那么这是一个很大的资源浪费
  3. 如果存在模块之间的依赖开发,你的snapshot版本是不能够被你的伙伴很方便的获取。
  4. 在实际开发过程中,有些jar的版本可能在中央仓库里面不存在,或者更新不及时,你是获取不到这个jar的。

所有以上问题,通过Nexus这个日益流行的仓库管理器可以轻松的解决。

    1. 这个仓库是本地的,下载的速度是从远程下载不可比的。
    2. 可以为你公司所有的Maven使用者服务,可以进行统一管理
    3. 后面我会介绍如何通过nexus来进行存在模块依赖的项目的开发
    4. 你可以添加自己的第三方包。 

安装 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的类型:

  • hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
  • proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
  • group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。

Maven central是Maven的中央仓库,点击它并选择configuration标签栏,我们会看到下面的页面

这里有几个项目是我们可能会经常用到的:

  1. Override local storage location: 在这个选项你可以配置你的Nexus本地仓库的存放地址,用来覆盖其默认的存放地址
  2. Remote storage location: 这里是远程仓库的地址,为了提高代理速度,你可以修改为国内的镜像地址。默认值是http://repo1.maven.org/maven2/

Download remote indexes: 这里配置是否下载远程索引文件,模式是false, 建议配置为true,这样我们便可以通过索引文件来搜索我们需要的构件

添加代理仓库

 

Maven central是一个比较大的代理仓库,如果你需要添加的一个代理仓库,那么可以在点击左边惨淡栏里面的Repositories,然后右边的页面点击add -> add proxy repository, 之后出现以下页面:


 

填写相关信息保存即可。通常情况下,使用预设的代理仓库已经能够满足大部分项目的需求了, 只有在特殊需求的情况下才会参加代理仓库.

管理本地仓库

我们前面讲到类型为hosted的为本地仓库,Nexus预定义了3个本地仓库,分别是Releases, Snapshots, 3rd Party. 分别讲一下这三个预置的仓库都是做什么用的:

  1. Releases: 这里存放我们自己项目中发布的构建, 通常是Release版本的, 比如我们自己做了一个FTP Server的项目, 生成的构件为ftpserver.war, 我们就可以把这个构建发布到Nexus的Releases本地仓库. 关于符合发布后面会有介绍.
  2. Snapshots: 这个仓库非常的有用, 它的目的是让我们可以发布那些非release版本, 非稳定版本, 比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用, 因为你的同伴正在依赖你的模块开发, 那么这个时候我们就可以发布Snapshot版本到这个仓库, 你的同伴就可以通过简单的命令来获取和使用这个临时版本.
  3. 3rd Party: 顾名思义, 第三方库, 你可能会问不是有中央仓库来管理第三方库嘛, 没错, 这里的是指可以让你添加自己的第三方库, 比如有些构件在中央仓库是不存在的. 比如你在中央仓库找不到Oracle 的JDBC驱动, 这个时候我们就需要自己添加到3rd party仓库.

你也可以创建自己的本地仓库,点击Repository面板上方的Add按钮,然后选择Hosted Repository,然后在下方的配置面板中输入相关信息, 这里我们不再需要填写远程仓库地址,根据自己的需要选择Release或者Snapshot,如图:
 



Maven 仓库组

仓库组的概念是Maven没有的,通过前面介绍可以了解到, 我们可以建立多个proxy代理仓库,hosted本地仓库, 如果没有仓库组的概念,我们如果需要引用这些仓库的是时候需要一一加入到我们的setting.xml里面去, 有了仓库的组的概念, 我们只需要做一次引用就可以了,把我们需要的仓库加入到仓库组即可.像这样:

抱歉!评论已关闭.