maven使用总结(二)

上一篇博客中我们大概讲了maven的一些基本的概念,以及maven是如何帮助我们构件项目的。这篇博客中我们讲重点讲解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 配置这个地址:

    
   D:/java/repository
</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-model-builder-3.2.3.jar 里面。你可以在里面找到/org/apache/maven/project/pom-4.0.0.xml 这个文件,在这个文件里面定义了中央仓库的地址:
<repositories>  
  <repository>  
    <id> centralid> 
    <name> Maven Repository Switchboardname>
    <layout> defaultlayout> 
    <url> http://repo1.maven.org/maven2url> 
    <snapshots>  
      <enabled> falseenabled> 
    snapshots>  
  repository> 
repositories>  
  • 我们知道Maven在建立项目的时候是基于Maven项目下的pom.xml进行的,我们项目依赖的信息和一些基本信息都是在这个文件里面定义的。那如果当我们有多个项目要进行,这多个项目有些配置内容是相同的,有些是要彼此关联的,那如果按照传统的做法的话我们就需要在多个项目中都定义这些重复的内容。这无疑是非常耗费时间和不易维护的。好在Maven给我们提供了一个pom的继承和聚合的功能。
  • 对于使用java的人而言,继承这个词大家应该都不陌生。要继承pom就需要有一个父pom,在Maven中定义了超级pom.xml,任何没有申明自己父pom.xml的pom.xml都将默认继承自这个超级pom.xml(超级pom的内容这里就不再展示了,读者自己去看)

  • 对于一个pom.xml来说有几个元素是必须定义的,一个是project根元素,然后就是它里面的modelVersion、groupId、artifactId和version。由上面的超级pom.xml的内容我们可以看到pom.xml中没有groupId、artifactId和version的定义,所以我们在建立自己的pom.xml的时候就需要定义这三个元素。和java里面的继承类似,子pom.xml会完全继承父pom.xml中所有的元素,而且对于相同的元素,一般子pom.xml中的会覆盖父pom.xml中的元素,但是有几个特殊的元素它们会进行合并而不是覆盖。这些特殊的元素是:

    • Dependencies
    • Developers
    • Contributors
    • plugin列表,包括plugin下面的reports
    • Resources
  • 有时候我们需要自己配置远程仓库地址。我们需要在什么时候配置远程仓库呢?当你连接中央仓库的速度比较慢时,或者你为你的公司搭建了自己的仓库,比如Nexus仓库管理(后面我会介绍),又或者你苏需要的jar存在另外一个公共仓库

  • 尽管pom.xml中可以方便的哦配置中央仓库,但是我并不推荐大家这么做,尤其是在大的公司中,因为一个公司会有很多的项目,如果每个项目都这样配置,那么又开始做重复的copy工作了,如何解决呢,我们往下走

在 settings.xml 中配置远程仓库

  • Pom.xml的作用范围是一个项目,一个公司不可能只做一个项目,那么为了避免重复配置,那么我们需要把一些公共信息配置在setting.xml中。但是setting.xml中并不支持repositories及pluginRepositories,为了解决这个问题我们使用profile:
<settings> 

  <profiles>
    <profile>
      <id> myProfielid>
      <!—在这里加入<repositories><pluginRepositories>–>  
    profile>  
  profiles> 
  <activeProfiles> 
    <activeProfile> myProfiel activeProfile>
  activeProfiles>
settings>
  • 这里通过元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了。

总结一下直接使用中央仓库获取你所需要的jar包会出现的问题:

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

利用Nexus来构建企业级 Maven仓库:

  • 所有以上问题,通过Nexus这个日益流行的仓库管理器可以轻松的解决。
    这个仓库是本地的,下载的速度是从远程下载不可比的。
    • 可以为你公司所有的Maven使用者服务,可以进行统一管理
    • 后面我会介绍如何通过nexus来进行存在模块依赖的项目的开发
    • 你可以添加自己的第三方包。
  • Nexus是Maven仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个非常有用的功能就是可以通过项目的SNAPSHOT版本管理,来进行模块间的高效依赖开发。Nexus的教程这里就不展示了。

jar包依赖:

  • 有了远程仓库我们就可以方便的获取项目中所需要的jar包了,现在可以痛快的说说依赖了。
  • 依赖的解决实际是Maven在classpath中添加相应的包。Maven项目的依赖由pom.xml中的元素设置。dependency元素中常用的子元素包括:
    • groupId、artifactId、version:依赖的基本坐标。
    • type:依赖的类型,对应于坐标的packaging。一般无需声明,默认为jar。
    • scope:依赖的范围。
    • optional:是否为可选依赖。
    • exclusions:用于排除传递性依赖。

你可能感兴趣的:(【Maven】)