maven多模块项目安装及使用

 

maven多工程项目安装管理

 

一、         检查JDK安装

 

建议安装jdk1.8

 

二、         Maven下载安装

下载地址:http://maven.apache.org/download.cgi

1.    安装

直接解压缩到D:\apache-maven-3.2.3-bin

2.    配置环境变量

应用 windows键+Pause Break键调出系统信息面板,点击高级系统设置,再点击环境变量,在系统变量中新建一个变量,变量名为M2_HOME,变量值为我们的Maven安装目录(D:\apache-maven-3.2.3-bin)。点击确定,接着我们在系统变量中找到一个名为Path的变量,在其变量值的末尾加上%M2_HOME%\bin;,注意多个值之间需要有分号隔开。点击确定。至此,环境变量设置完成。

3.    本地仓库 vs. 远程仓库

运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

比如说,你的项目配置了junit-3.8的依赖,在你运行mvn test 的时候,Maven需要使用junit-3.8的jar文件,它首先根据坐标查找本地仓库,如果找到,就直接使用。如果没有,Maven会检查可用的远程仓库配置,然后逐个尝试这些远程仓库去下载junit-3.8的jar文件,如果远程仓库存在该文件,Maven会将其下载到本地仓库中,继而使用。如果尝试过所有远程仓库之后,Maven还是没能够下载到该文件,它就会报错。

Maven缺省的本地仓库地址为${user.home}/.m2/repository 也就是说,一个用户会对应的拥有一个本地仓库。

你也可以自定义本地仓库的位置,修改${user.home}/.m2/settings.xml :

<settings>

  ...

 <localRepository>D:\java\repository</localRepository>

  ...

</settings>

了解了本地仓库,接着了解一下Maven缺省的远程仓库,即Maven中央仓库。

安装好Maven之后,我们可以建立一个简单的项目,配置一些简单的依赖,然后运行mvn clean install,项目就构建好了。我们没有手工的去下载任何jar文件,这一切都是因为Maven中央仓库的存在,当Maven在本地仓库找不到需要的jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。

这个Maven中央仓库是在哪里定义的呢?在我的机器上,我安装了maven-2.0.10,我可以找到这个文件:${M2_HOME}/lib/maven-2.0.10-uber.jar ,打开该文件,能找到超级POM:\org\apache\maven\project\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置:

  <repositories>

    <repository>

      <id>central</id>

      <name>Maven RepositorySwitchboard</name>

      <layout>default</layout>

     <url>http://repo1.maven.org/maven2</url>

      <snapshots>

        <enabled>false</enabled>

      </snapshots>

    </repository>

  </repositories>

关于远程仓库的配置,下面的小节我会详细解释,这里我们只要知道,中央仓库的id为central,远程url地址为http://repo1.maven.org/maven2,它关闭了snapshot版本构件下载的支持。

 

 

修改本地仓库地址

修改D:\apache-maven-3.2.3-bin\conf\setting.xml文件

  找到上面所画红线的地方,将该段代码从注解中抽取出来,放到外面,如D:/mavenlib。即是Maven下载下来的资源存放的地方

  我们拷贝D:\apache-maven-3.2.3-bin\conf\setting.xml到自己的目录D:\mavenlib下面,与全局的setting分开。

 

安装完成后,执行mvn help:system命令,该命令会打印出所有的Java系统属性和环境变量。这些信息对于我们日常的编程工作很有帮助。这条命令的目的是为了让Maven执行一个真正的任务。我们可以从命令行输出看到Maven下载maven-help-plugin,包括pom文件和Jar文件。这些文件都被下载到了Maven本地仓库中。

现在打开用户目录,比如我目前的用户目录是C:\Users\jiancheng\,你可以在vista和windows7中找到类似的用户目录,而之前的windows版本,该目录应该是类似于C:\Documentand Settings\jiancheng\.

  在用户目录下,我们可以发现.m2文件夹。默认情况下,该文件夹下放置了Maven本地仓库.m2/repository。所有的Maven构件(artifact)都被存储到该仓库中,以方便重用。

 

 

 

4.    在POM中配置远程仓库

前面我们看到超级POM配置了ID为central的远程仓库,我们可以在POM中配置其它的远程仓库。这样做的原因有很多,比如你有一个局域网的远程仓库,使用该仓库能大大提高下载速度,继而提高构建速度,也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。

这里我配置一个远程仓库指向中央仓库的中国镜像:

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

 

我们先看一下<repositories>的配置,你可以在它下面添加多个<repository> ,每个<repository>都有它唯一的ID,一个描述性的name,以及最重要的,远程仓库的url。此外,<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。

关于<repositories>的更详细的配置及相关解释,请参考:http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html。

至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和<repository>完全一样,不再解释。

 

 

5.    仓库管理器nexus

  上文中提到了本地仓库、远程仓库,Maven缺省的本地仓库地址为${user.home}/.m2/repository

肯定有人要说,全世界的maven开发者都去访问这个中央仓库?那它的压力得有多大啊!还有如果我的网速不够理想,下载一次构件都耗费好长时间啊。这都是一些典型的问题,就是因为这些问题,nexus应运而生了。详情看下面的章节。

三、         仓库管理器Nexus

本章节的内容可以放到最后再看。

1.    nexus介绍

nexus其实是一个仓库管理器,在使用maven的时候,你通常可以从中央仓库获取需要的构件,但这通常不是一个好的做法,你应该在本地架设一个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间,Nexus就可以满足这样的需要。说的通俗一点儿,就是在本地maven仓库和中央仓库之间再建一个中间仓库,本地仓库如果需要下载构件可以先去这个仓库管理器获取,如果仓库管理器有了那么直接就可以用,如果仓库管理器没有那么由它去中央仓库获取。通常,在一个公司内部,可以创建公司级的仓库管理器,相当于一个公司只有这个仓库管理器去和中央仓库打交道,而这个仓库管理器通常设置在公司内网,大大减轻了从中央仓库获取构件的带宽和不必要的磁盘浪费。

nexus还提供了强大的仓库管理功能,构件搜索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。

 

 

2.    nexus下载

http://www.sonatype.org/nexus/go/

3.    nexus安装

下载完,解压缩后可以看到两个文件夹,一个是nexus-2.9.2-01,另一个是sonatype-work,我们只需要将nexus-2.9.2-01拷贝到需要安装的路径即可,比如在我的机器上,我copy到了D:\apache-maven-3.2.3-bin目录下,sonatype-work可以不拷贝。

很简单,这就安装完了。

4.    nexus启动

nexus已经将各个平台的启动脚本都写好了,并分开目录放置,具体可以查看nexus-2.9.2-01\bin\jsw目录,我的机器是windows64位的,就可以进入到windows-x86-64目录下,点击console-nexus.bat即可启动,启动完成后,访问url:http://localhost:8081/nexus即可看到nexus的页面,如果是其他平台,找到对应的目录启动脚本即可。

到这里为止,我们的nexus就已经启动起来了,下一节,我们来讨论一下如何配置nexus。

5.    nexus管理

 

上一章节,我们讲述了nexus的概况和安装,并且成功启动了nexus,这一节我们讨论下nexus是如何工作的,如果来配置和管理nexus的。

接着上一节,我们启动了nexus后,可以通过浏览器访问到nexus的管理界面:http://localhost:8081/nexus。管理员登陆密码默认为:admin/admin123,UI界面是Ext来搭建的,操作起来没有什么障碍,而且界面看起来很清爽。

好,我们输入用户名密码开始来配置nexus。

输入用户名密码登陆进去之后,看到如下界面:左侧分为4部分,其中views/repositories是仓库相关的管理项;security是安全权限相关的;administrotr是管理相关的;help是帮助相关的。

 

5.1.  仓库配置-仓库浏览

点击左侧的“views/repositories–>repositories”,右边列出来了nexus默认的仓库,其中有四种类型的仓库,分别是hosted、proxy、virtual、group

  1. hosted,宿主型的,实实在在由nexus给管理的仓库,nexus自带了3个宿主仓库
  2. proxy,代理型的,每个仓库都是对一个远程仓库的代理,这其中就包括了对中央仓库的代理
  3. virtual,虚拟型的,这个不太了解,就不说了
  4. group,严格来说它不是一个仓库,顾名思义,是组的意思,它相当于是由多个仓库合成了一个组,由该组的url对外提供服务,nexus默认有两个组,一个是public group,其中包含了上边的3个宿主仓库和中央仓库;另一个是public snapshots group,里边包含了Apache Snapshots和CodeHaus Sanpshots。当然这些组包含的内容是可以修改的。

同时,nexus提供了增加、删除、修改仓库定义的功能。

 

 

5.2.  仓库配置-打开远程索引下载

上一篇文章咱们也提到了,巨大的用户访问中央仓库会带来巨大的网络压力和服务器压力,因此在nexus中默认的各个代理仓库的索引都是关闭状态,即安装完nexus后里边是空的,什么东东都没有,包括索引。我们现在要做的就是需要把这个索引给下载到nexus服务器中,以便使用者可以从nexus中搜索到相关构建。

方法如下:

  1. 选中中央仓库这条记录,即名字为central的仓库

  1. 下边选中configuration选项卡,找到其中的Download Remote Indexes,把fasle改为true,并保存

  1. 在上边的中央仓库记录上点击右键,选择update index

  1. 下载完成后然后在下边选中Browse Index选项卡,打开central这颗树的节点,应该能看到内容。在下载索引之前是空的。在上面的步骤中,update index是不会显示任务信息的,如果在下图中,看不到内容,点Refresh按钮,有时会很慢,等……。可能会提示超时,或远程maven库地址不正确,验证的方式一是点击下图的Browse Remote查看,远程仓库内容,如果能看到说明远程地址没有问题。二是通过浏览器看看地址可用否。

其他的proxy类型的仓库,都可以用同样的方法来下载索引。

注意:这一步仅仅是下载了远程仓库的索引,真正的构件还没有下载到nexus中。等真正有实际用户使用这些构件的时候,才会从中央仓库下载需要的构件文件。

 

5.3.  仓库配置-搜索构件

在使用maven之前,如果我们的项目中需要使用一个jar包,我们一般会怎么做呢?举个例子,我们要使用dom4j这个包,那么我们一般要去官方网站下载或者去baidugoogle里边直接搜索,版本呢只能逮到哪个是哪个了。这种情况如果找一个两个jar还行,如果多了将会带来巨大的工作量,而且还非常容易导致缺包、冲突等问题。

   现在有了maven,工作将会变的非常简单。还以找dom4j这个jar来举例子,在nexus的页面中搜索“dom4j”这个词,看如下结果左侧的搜索框输入了dom4j,右侧上方出现了所有包含dom4j的项目,加入我们需要1.6.1版本的dom4jjar,那么点击相应的条目在下方就会列出来。搜索到之后怎么用呢?右侧给出了依赖xml格式的数据,只需要将该xml  copy到你的pom.xml中,那么你的项目将会自动从nexus下载(注:项目中配置nexus的方法还没说,下一篇文章细说)。

说到这里,可能会有疑问,那假如说我的项目需要A.jar,但是A.jar又依赖B.jar,那我是不是还要依次去找所有的依赖jar呢?答案是否定的,maven已经给你提供了最简单的方法,只要你依赖了A.jar,那么A.jar所需要的所有jar它将自动帮你查找下载。怎么样,省事了很多吧。

5.4.  仓库配置-创建仓库

我们来做一个创建proxy类型的仓库,点击仓库里边上方的“Add….—>ProxyRepository”

 

Id是唯一的,输入一个名字,Remote Storage Location输入jbossmaven仓库地址,下边的代理相关的设置根据自己的情况来确定,输入完后点击保存即可。创建完成后按照5.2节提供的方法下载索引即可。

 

5.5.  仓库配置-组管理

组是若干仓库的一个集合,那么如何来管理组中包含的仓库呢?看下图:选中public Repositories这条记录,选中下方的configuration选项卡,左侧列出了已经选择的仓库列表,右边是可选的,通过中间的箭头来控制仓库列表信息。

5.6.  管理相关-代理设置

  如果nexus服务器上网需要设置代理,那么需要在Administration–>Server中设置,如下图所示:

5.7.  修改帐户密码

  Security-->Users中配置,在deployment用户上点击右键,选择SetPassword,然后设置一个密码,做这个操作是为了后面提交做准备 

 

6.    nexus配置

6.1.  配置nexus简介

 

上一篇文章,我们讨论了nexus的管理与基本配置。那么,当nexus配置完了之后,就相当于我们本地项目与maven中央仓库这个桥梁已经搭好了,剩下的就是看怎么通过怎样的配置来使用nexus。在本地开发的时候,主要牵涉到两个配置文件,一个是settings.xml%M2_HOME%/conf/settings.xml%USER_HOME%\.m2\settings.xml),一个是项目中的pom.xml。所有的主要配置都集中在这两个配置文件中,下边咱们就通过一个实际的项目的例子来说说这两个配置文件的用法。

 

我们打开父项目platformpom.xml文件,里边可以找到:

<groupId>com.chenrui.platform</groupId>

  <artifactId>platform</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>pom</packaging>

  <name>Intergrated Platform</name>

<description>Intergrated Platform</description>

 

<modules>

    <module>platform-parent</module>

    <module>platform-common-project</module>

    <module>platform-system-project</module>

    <module>platform-configration-project</module>

    <module>platform-webservice-project</module>

    <module>platform-mq-project</module>

    <module>platform-web-parent</module>

</modules>

 

在子项目的pom.xml的文件中,也能找到类似的

<parent>

   <artifactId>platform</artifactId>

   <groupId>com.chenrui.platform</groupId>

   <version>0.0.1-SNAPSHOT</version>

 </parent>

  <groupId>com.chenrui.platform</groupId>

  <artifactId>platform-common-project</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>pom</packaging>

  <name>platform-common-project</name>

  <description>public basic warehouse for company(公司公共通用类库)</description>

  <modules>

    <module>platform-common</module>

  </modules>

 

也就是说,在父项目和子项目中,都有说明他们之间的关系。

我们知道maven父项目和子项目的pom.xml是有继承关系的,也就是说各个模块相同的部分,我们可以配置到父项目的pom.xml文件中,这样子项目中的pom.xml只放自己个性的东西就可以了,这大大减少了工作量。另外,在编译和打包等其他阶段,都可以统一在父项目中来进行,maven会自动操作其中的子项目,提高了效率。

【注意:】事实上,所有的maven项目都会继承一个超级pom,这个pom就是%M2_HOME%\lib\maven-2.2.1-uber.jar中的org\apache\maven\project\pom-4.0.0.xml

6.2.  配置nexus

nexus里可以配置3种类型的仓库,分别是proxyhostedgroup 

proxy是远程仓库的代理。比如说在nexus中配置了一个central repositoryproxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用 

hosted是宿主仓库,用户可以把自己的一些构件,deployhosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted 

group是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了

 

一般会配置3hosted repository,分别是3rd partySnapshotsReleases,分别用来保存第三方jar(典型的比如ojdbc6.jar),项目组内部的快照、项目组内部的发布版 

 

 

创建组group,组名为321

创建proxy,名为321-proxy 地址为http://maven.oschina.net/content/groups/public/,默认的Central的Remote StorageLocation 为https://repo1.maven.org/maven2/

创建hosted

  321-3rd party

  321-snapshots

  321-releases

我们知道,我们假设仓库管理器的目的是为了减少与中央仓库的交互,既然这样,那我们在本地肯定要配置nexus的相关信息,以便能够把中央仓库的配置覆盖掉,从而真正来使用

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值