Hudson+maven+svn+sonar搭建CI环境(web篇)--上
前些日子研究了CI的具体流程,在过程遇到许多意料之外的困难,现在终于爬出坑,特此将经验分享给大家,希望大家少走写弯路
需要:
JDK1.5及以上版本
tomcat
Hudson
svn
Maven
Nexus(做Maven远程仓库用,非必须)
sonar
eclipse
1.SVN
svn的搭建就不提了,大家请自行搜索
2.Maven
首先去官网http://maven.apache.org/download.cgi下载maven,将下载的文件解压,然后配置maven环境
新建变量:
变量名:M2_HOME
变量值:D:\maven-3.2.3\apache-maven-3.2.3
找到path,加入;%M2_HOME%\bin;
运行cmd,输入mvn -v
ok,第一步完成;
maven仓库用来存放我们项目依赖的jar包,maven默认的仓库路径是(你自己的user路径)/.m2/repository,我们可不想某天重装系统的时候把这里面的东西清空,所以我们需要修改仓库路径,首先创建一个你自己的仓库文件(例如我的D:\maven\repo),然后打开(你自己的maven路径)\apache-maven-3.2.3\conf,找到setting.xml文件,在里面找到<localRepository>,改成你自己的仓库路径。
完成之后cmd运行mvn help:system;如果运行过程中无错,我们会在自己的仓库文件中发现已经多了很多文件,这些文件就是maven从中央库下载下来的。
PS:
如果用Eclipse作为IDE的话(或许intelliJ会更好?),去安装m2e(eclipse支持maven的插件),有离线和在线安装两种方式,就和安装其他的插件方法类似。
安装完成后就可以去创建项目或将已有项目弄到maven上来,对于新创建项目,大家可以去查阅虫师写的文章《maven环境快速搭建》,文章介绍了从cmd创建maven项目,大家也可以在eclipse(已安装m2e插件)里直接创建maven project;这里因为我是将已有项目改成maven结构,就只介绍后者的做法。
对于已有项目,直接对项目右键-->Configure-->Convert to maven project
这里因为博主是web项目所以packaging选择打成war包。
完成后你的项目结构会发生一点变化,然后咱们进入pom.xml
在pom.xml中找到如下字段(如果没有就添加上),明眼人可以直接看出其实<sourceDirectory>...</sourceDirectory>其实就是你的源码路径,<directory>...</directory>就是你的资源路径,只要让maven知道你的源码在哪,资源库在哪,它就会自动去运行这些文件。(下文有完整的pom.xml文件)
然后检查一下maven的相关设置是否已经配置好(一般m2e插件会帮咱们弄)
右键-->properties-->java build path-->Libraries查找一下有没有M2_REPO,
如果没有,点击Add Library自行添加。
然后查看Source
如果源码文件夹没有设置Output folder,点击Edit,输入
完成后回到pom.xml,开始编辑,下面是我的pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>mcrm_web</groupId> <artifactId>mcrm_web</artifactId> <version>1.0.2</version> <packaging>war</packaging>
<!-- 这里是为了让sonar在编译时按UTF-8来编译 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies>
<!-- 这部分是我的项目依赖的jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.1.1.RELEASE</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20131018</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>servlet-api</artifactId> <version>5.5.23</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-servlet_3.0_spec</artifactId> <version>1.0</version> <scope>provided</scope> </dependency>
<!-- 这个依赖我没有在中央库里找到,所以把他变成本地的了--> <!-- 本地依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.1.1.RELEASE</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.6</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.directory.studio</groupId> <artifactId>org.apache.commons.lang</artifactId> <version>2.6</version> <scope>provided</scope> </dependency> <!-- 本地依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.1.1.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> <build>
<!-- 告诉maven我的源文件位置--> <sourceDirectory>src</sourceDirectory>
<!-- 告诉maven我的资源库在哪-->
<resources> <resource> <directory>src</directory>
<!-- 告诉maven在编译时不要将后缀是.java的文件放进war包里 -->
<excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <plugin>
<!-- 编译插件 --> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration>
<source>1.6</source> <target>1.6</target> <encoding>utf8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <warSourceDirectory>web</warSourceDirectory> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
在POM中,你需要注明所有非JDK自带的依赖,这些依赖的版本号和名称都是特定的,在maven仓库中你能找到大部分所需要的依赖,例如咱们需要找spring-context这个jar包,进入仓库中,输入spring-context,找到自己所需要的那个,选择合适版本,然后直接将对应的groupid和artifactld以及version写入pom中,例如:
但有些时候咱们依赖的jar包在仓库中查询不到,这时咱们就需要手动添加jar包,例如:
这个jar包我没有在maven仓库中找到,就直接把jar包扔进了相应的路径中
~\repo\org\springframework\spring-jdbc\3.1.1.RELEASE(这些文件夹原来是没有的,都是我自己建的)
将这些东西做完后,就可以run一下看看了,有两种方式,第一种是在cmd中,进入项目所在的目录中(保证这个目录下有pom.xml),运行mvn clean install。第二种方式是在eclipse中右键-->Run As--> Maven install 。
可能出现的错误:
如果编译出错,报出缺少某些包的话,看好是哪些包,直接去maven仓库中找,找到后写入pom.xml中。
如果出现乱码的话,在pom.xml中加上让maven以UTF-8来编译。
如果编译成功了,那咱们可以在项目目录\target下找到打包好的war包,把它直接扔到tomcat里,试试能不能运行吧。(这里我遇到一个问题,新打的war包不会把最新的.class文件放进去,而是放最早编译完成的,我的解决方法是将\target\classes里的东西扔到项目目录\web\WEB-INF\classes里再打包一次,应该是某处设置有误,但现在我还未找到)
至此,CI的maven部分就基本介绍完了,下篇将介绍hudson和sonar部分。
参考文章:
[2]Myeclipse 8.5 配置SVN - ewyb - 博客园
[3]Maven 详解 - 小菜鸟的博客 - 博客频道 - CSDN
[4]如何在maven中添加本地jar包 - maven - ITeye群组