感谢支持
我们一直在努力

64位CentOS:持续集成之路——Maven

写在前面

      自从参加了4月份的QCon以后,持续集成的念头一直在脑海中浮现。时隔四个月之后,终于有了实践的机会。在此,首先应该感谢头儿们的大力支持。记得参加Scrum的培训时,最开始提到的一个障碍就是来自上层。因为上层希望看到的是实实在在的成果,如果现有的开发模式和质量管理系统已经有了比较好的效果,他们就不太愿意尝试新的模式。而这次正是有了头儿们的理解和支持,我才能放开手脚、“无所顾忌”地尝试这些新手段。其次,应该感谢我的天才同事们。因为,每次即使小小的改动都会给他们的开发带来一些不便,但是他们都会毫无抱怨地接受,并且总能给出一些我意想不到的想法,帮助我不断地改善这个系统。


      虽然当前的CI系统还存在诸多问题,但是应该是时候做个总结了,记下这个过程发生的点点滴滴。还是那句话,能帮助看到这些文章的同学解决一些实际的问题。


      CI运行的操作系统是:64位的CentOS


      版本控制系统是CI中不可缺少的一环,在这两篇文章中已经记录了Subversion在CentOS下安装和配置过程:


      Cent OS上配置Apache2 + SVN http://www.linuxidc.com/Linux/2011-07/39577.htm


      Cent OS上配置Apache2 + SVN(续)实现对目录访问的精确控制 http://www.linuxidc.com/Linux/2011-07/39577p2.htm


      这次就从Maven开始。


      第一次和Maven的交战,我铩羽而归。这次做好了打持久战的准备。 


      一、安装(与Eclipse集成)


      在Eclipse下使用Maven,需要安装m2eclipse插件:


      1、Eclipse的Help菜单–>Install New Software


      2、将插件的地址(http://m2eclipse.sonatype.org/sites/m2e)添加到可用Software Site中



       3、勾选中间框中出现的“Maven Integration for Maven”,下一步



       4、Eclipse就开始查找可以安装的组件以及依赖的包



       5、即将安装的插件,会被列出



       6、经过几分钟等待以后,会提示安装成功,需要重启Eclipse



      


       注意:


       1、对于第一次安装的插件,在5、6步骤之间会出现安装协议节目,直接选择接受(Accept),下一步(Next)即可。


       2、通过上面的URL安装m2eclipse的版本是最新的0.10.0,由于该版本不能直接从0.9.8或者0.9.9升级得来,因此如果原来已经安装了m2eclipse0.9.8或者m2eclipse0.9.9就需要先卸载,再安装0.10.0。卸载方法如下:


      (1)Eclipse的帮助(Help)菜单中的“关于Eclipse”(About Eclipse)


     


      (2)选择原来安装m2eclipse插件卸载即可


      


 


       (3)完成卸载之后,需要重启Eclipse。然后再按照上面的步骤安装最新的m2eclipse即可。


 


        问题:在安装正常结束,并且重启Eclipse后,有时候会看到这样的提示:Eclipse is running in a JRE, but a JDK is required
  Some Maven plugins may not work when importing projects or updating source folders.


        解决方法:找到Eclipse安装目录,编辑eclipse.ini文件,保存后,重启Eclipse即可:       


       


         二、使用Maven


         1、新建一个项目


         (1)打开新建Project向导窗口


        


         (2)直接下一步


         


         (3)中间步骤都直接下一步(next),直到:


         


         这里只是创建了项目,接下来就可以使用Maven来管理项目中用到的library。


(接上篇)在新创建了项目之后,可以看到目录结构:


 


      从图中可以看出,Maven自动将项目源文件和测试用例分别放到了不同的目录下,但是却使用了相同的包名。这样生成可执行的产品时,就比较容易将产品代码和测试代码隔离开;同时测试用例也可以直接引用同一包中被测试的类,既符合了JUnit的规范,也使程序更易读。


      正如上图中标示,新建项目的JRE默认为J2SE-1.4,这会导致1.5之后的一些新特性得不到支持。可以通过下面的方法修改:



 


 


      2、使用Maven管理依赖 


      在以往的开发中,我一般都会把用到的依赖都放到一个文件夹下,需要什么就像里面添加什么,然后和源文件一同放入到SVN中。其他开发人员在检出项目时会把这些包一起检出。但是这样做有几个弊端:


    (1)最明显的一个问题,就是代码库会变得异常地大,有时候会上百兆,检出的时间会比较长


    (2)为了保持每个开发人员的开发环境的设置都是独立的,我们会要求开发人员不能提交Eclipse项目配置文件,如.project、.settings等。这就需要每个开发人员必须自己配置自己Eclipse的构建路径(Build Path)。如果有新的依赖提交,而其他开发人员不知晓的情况,就可能编译会出错;


    (3)Java的库文件对版本的要求比较严格,而有些第三方包发布并没有说明其所依赖的版本,需要自己苦苦寻找;


    (4)虽然我们并不常会看第三方库的源代码,但是有时候也需要进去了解一下,帮助解决问题。这时就需要自己在Eclipse中指定源文件的位置。


    而Maven很好的解决了以上问题,只需要一个配置文件,就可以搞定所有了。比如要在上面的MavenDemo项目中引入JUnit:


   


         点击OK后,就会将依赖自动下载到本地,并添加到项目的构建路径中,



 


查看pom.xml的内容,就会发现依赖在文件中的配置:


  1. <dependencies>  

  2.     <dependency>  

  3.         <groupId>junit</groupId>  

  4.         <artifactId>junit</artifactId>  

  5.         <version>4.4</version>  

  6.         <type>jar</type>  

  7.         <scope>compile</scope>  

  8.     </dependency>  

  9. </dependencies>  


      如果以后需要更改版本,只需要修改这里的版本号即可,当然可以从依赖的页面中删除和添加。


      在上面提到了Maven可以自动管理依赖的依赖,为了显示这个强大的功能,特意引入了一个spring-core的包,然后切换到pom的Dependencies Graph页面,可以看到,虽然只引入了一个spring-core,但是Maven却自动发现了它依赖的另外两个包,省去我们的很多麻烦。



3. 运行测试用例


在/src/test/java编写一个测试用例,然后直接在项目名称上点击右键,从菜单中选择Run as–>maven test。在运行过程中,Maven会自动下载需要的包,并且给出一份详细的测试报告。       



这种方式可以运行项目中所有用例。当然可以依照原来的习惯,在项目目录中选择一个文件,按照JUnit的方式运行。

在开发过程中,有时候会使用到公司内部的一些开发包,显然把这些包放在外部是不合适的。另外,由于项目一直在开发中,这些内部的依赖可能也在不断的更新。可以通过搭建公司内部的Maven服务器,将第三方和内部的依赖统一管理。

      这里使用Nexus来搭建本地的Maven服务器,过程比较简单。 


      一、安装服务器


      1、下载


      我们可以在nexus的官网上找到它的相关介绍,下载地址是:http://nexus.sonatype.org/downloads/,在这里可以找到最新的版本,如果需要以前的版本,在官网上应该也可以找到下载地址。我下载的是:nexus-oss-webapp-1.8.0-bundle.tar.gz。关于Nexus的详细使用方法可以参照:Repository Management with Nexus.


      2、安装


      解压下载的文件:


      # tar xzvf nexus-oss-webapp-1.8.0-bundle.tar.gz


      解压后会在同级目录中,出现两个文件夹:nexus-oss-webapp-1.8.0和sonatype-work,前者包含了nexus的运行环境和应用程序,后者包含了你自己的配置和数据。


      3、启动nexus


      在上面的提到,nexus的运行环境在nexus-oss-webapp-1.8.0目录,下面就进入这个目录启动:


      # cd nexus-oss-webapp-1.8.0/bin/jsw/linux-x86-64/


      在这个目录下包含了一个文件夹和三个文件:lib、nexus、platform和wrapper,其中nexus就是启动命令。


      # ./nexus


      执行上面的命令,可以得到nexus命令的用法提示:start 命令启动,stop命令停止。下面启动nexus:


      # ./nexus start


      Starting Nexus OSS…


      Started Nexus OSS


      从控制台输出可以看到Nexus已经启动成功,我们可以通过log文件查看更详细的信息:


      # cd ~/nexus-oss-webapp-1.8.0/log


      # tail -f wrapper.log


      在log中可以看到nexus默认监听的端口是8081。那么我们就可以在浏览器中访问:http://host:8081/nexus,


     


     


       二、配置Nexus


       由于在新搭建的nexus环境中只是一个空的仓库,所以第一步就是要和远程的Maven中心仓库进行同步。


        


      


        


       如果在Reindex之后,并没有同步到远程的仓库,可以检查每个仓库的设置。下面是Maven Central的设置:


 


      


 


三、在项目中使用私服


在完成了上面的配置后,就可以将项目中默认的Repository切换为本地的私服了,只需要在pom.xml中增加repositories就可以了:


  1. <project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  

  2.   xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>  

  3.   <modelVersion>4.0.0</modelVersion>  

  4.   

  5.   <groupId>org.maven.demo</groupId>  

  6.   <artifactId>MavenDemo</artifactId>  

  7.   <version>0.0.1-SNAPSHOT</version>  

  8.   <packaging>jar</packaging>  

  9.   

  10.   <name>MavenDemo</name>  

  11.   <url>http://maven.apache.org</url>  

  12.   

  13.     <repositories>  

  14.         <repository>  

  15.             <snapshots>  

  16.                 <enabled>true</enabled>  

  17.             </snapshots>  

  18.             <id>public</id>  

  19.             <name>Public Repositories</name>  

  20.             <url>http://172.28.189.138:8081/nexus/content/groups/public/</url>  

  21.         </repository>  

  22.     </repositories>  

  23.     <pluginRepositories>  

  24.         <pluginRepository>  

  25.             <id>public</id>  

  26.             <name>Public Repositories</name>  

  27.             <url>http://172.28.189.138:8081/nexus/content/groups/public/</url>  

  28.         </pluginRepository>  

  29.     </pluginRepositories>  

  30.     <dependencies>  

  31.         <dependency>  

  32.             <groupId>junit</groupId>  

  33.             <artifactId>junit</artifactId>  

  34.             <version>4.8.1</version>  

  35.             <type>jar</type>  

  36.             <scope>compile</scope>  

  37.         </dependency>  

  38.     </dependencies>  

  39.     <properties>  

  40.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  

  41.   </properties>  

  42. </project>  


将pom.xml保存后,再回过头来了看去nexus管理界面看,就会发现junit已经被下载到本地的nexus服务器中了。

今天在创建一个新的Maven项目时,在其中添加了很多依赖。刚开始为了避免错误就每添加一次,保存一下,Eclipse就会下载相应的包。最后为了加快速度就把剩下的包全部添加了,再次保存就出现Missing artifact错误,就连以前正常的包也出现了这个问题。

于是一个个删除新添加的依赖,当删除了一个叫做quartz-all的依赖后,一切都正常了。然后把其他依赖都添加上,也是正常的。于是去本地的repository查看quartz-all的详细信息,发现里面只有一个quartz-all.jar,而其他目录同时还包含一个相应的pom文件。初步判定是这里的问题。然后去远程的仓库查看,也没有pom文件。忽然想起来,上传本地依赖到nexus私服时,可以自动产生相应地的pom。于是就把本地已经下载quartz-all.jar上传到nexus中,然后在项目中引用这个依赖。问题解决。 


       总结:


       问题现象:Maven下载依赖时,出现Missing artifact错误提示


       原因: 其中某一个或者几个依赖缺少pom文件


       解决方法:将依赖包上传到maven私服中,然后引用新的依赖。

赞(0) 打赏
转载请注明出处:服务器评测 » 64位CentOS:持续集成之路——Maven
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏