项目中用到了SpringMVC、ibatis、maven等开源框架,因此想构建一套完整的开源项目开发环境。主要思路为:开发(自动生成bo/dao/xml,SpringMVC)->单元测试->持续集成编译->发布->重启等步骤。
本文只介绍初步的思想和用到的工具,不涉及具体细节。
一、自动生成bo/dao/xml对象
mybatis支持自动生成bo、dao、dao.xml配置文件,见如下类:
package com.xxx.xxx;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
/**
* 自动生成Mapper配置文件的单元测试类
* @类名: GeneratorSqlMapTest.java
* @描述:
* @作者: mxyanx
* @修改日期: 2014年6月24日
*/
@Transactional
public class GeneratorSqlMapTest extends AbstractJUnitTest {
@Value("${mybatis.config.path}")
private String myBatisConfigPath;
@Before
public void init() {
System.out.println("开始生成配置文件!!");
}
@Test
@Rollback(false)
public void tesDemo() {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
System.out.println(myBatisConfigPath);
File configFile = new File(this.myBatisConfigPath+"/mybatisSqlMapGeneratorCfg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = null;
try {
config = cp.parseConfiguration(configFile);
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = null;
try {
myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
} catch (InvalidConfigurationException e) {
e.printStackTrace();
}
try {
myBatisGenerator.generate(null);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@After
public void destory() {
}
}
这里的mybatisConfigPath依赖服务器配置的配置文件路径,例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 为了防止生成的代码中有很多注释,比较难看,加入下面的配置控制 -->
<context id="yihaomen_mysql_tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
<property name="suppressDate" value="true" />
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
connectionURL="jdbc:sqlserver://ip:port;DatabaseName=test"
userId="user" password="pwd">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 数据表对应的model 层 -->
<javaModelGenerator targetPackage="com.xxx.xxx.bo"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- sql mapper 映射配置文件 -->
<sqlMapGenerator targetPackage="com.xxx.xxx.dao"
targetProject="src/main/resource">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</sqlMapGenerator>
<!-- 在ibatis2 中是dao层,但在mybatis3中,其实就是mapper接口 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.xxx.xxx.dao"
targetProject="src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 数据库表配置 -->
<table tableName="数据库表明" domainObjectName="生成的BO.class对象" enableInsert="true"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<generatedKey column="id" identity="true" sqlStatement="SELECT @@IDENTITY as column_name"/>
</table>
</context>
</generatorConfiguration>
二、SpringMVC
SpringMVC的开发框架大家都应该很熟悉,通过@Controller、@Service、@Repository可以分别将表示层、服务层、数据库层分别加载到Spring容器,从而省略了bean在配置文件中的注册。
遵循几个原则:
1、Controller层只进行页面逻辑处理和数据接口调用,因此一个Controller的内容应该不会很长,业务实现不能放在Controller层完成。
2、Service层进行业务逻辑封装,对Controller层暴露接口,调用DAO层接收元数据。
3、DAO层与数据库交互,将结果透传到Service层。
三、基于jenkins的持续集成环境搭建
下载jenkins.war文件,直接拖放到tomcat的webapps目录,启动服务后即可完成持续集成的部署。注意,要完成持续集成环境的搭建,还必须在服务器上安装依赖的工具包,如:maven、svn等。
jenkins的主要思想是:从svn服务器下载源码包,编译成war包,然后部署到tomcat容器中,同时可以远程执行服务器上的shell命令,达到重启服务的目的。
jenkins运行主要用到了插件,有几个插件必不可少:subversion.hpi、svnpublisher.hpi,这些插件可能又依赖其他的插件。插件可以从server服务器上下载到本地之后安装。
jenkins安装完插件之后,需要进行全局配置,主要配置两部分:
1、用户权限配置:默认是所有的匿名用户可以做任何事情,也可以让用户进行强制注册。
2、Server配置:目的是项目编译完成之后,通过SSH插件将编译好的war文件sftp传输到指定的服务器目录。(前提是有sftp权限)
四、nexus私服搭建
jenkins在编译项目时,如果不搭建私服,则服务器每次都会从远程中央仓库拉取jar文件进行编译,这样会带来效率问题,因此需要搭建私服。操作步骤大致为:
1、下载nexus的jar包,例如: nexus-oss-webapp-1.9.2.3-bundle.tar.gz,解压后可以用tomcat容器起起来,也可以用命令起:进入~/nexus-oss-webapp-1.9.2.3/bin/jsw/linux-x86-64/目录下执行“./nexus start”
2、nexus默认端口是8081,用户名admin、密码admin123,从左侧菜单点击可以看到不同的仓库,一般我们用到了三个主要仓库:Maven Central、3rd party、Google Code,也可以自定义仓库。
3、配置好之后设置maven的settings.xml全局仓库地址,例如:
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>http://localhost:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
上述只是部分内容,全局设置LocalRepository、mirrors等可以上网查找。
如果jenkins从私服上拉取不到jar文件,则仍然会从中央仓库拉去文件。
五、shell脚本编写
前面讲到通过开发、编译、打包、上传之后,就要重启服务了,这里写了个例子用来执行wxadmin的用例(主要思路是先查找进程,然后杀进程,最后重启服务),如下:
#!/bin/sh
sto(){
echo "stop.........."
kill -9 `exec ps ax|grep java|grep -v grep|awk '{print $1}'`
rm -rf /usr/local/wxadmin/webapps/wxadmin
}
sta(){
echo "start........."
/usr/local/wxadmin/bin/startup.sh
}
case $1 in
start) sta;;
stop) sto;;
restart) sto;echo "restart....";sleep 3;sta;;
*) sto;sleep 2;sta;;
esac
如此,则开源项目开发编译打包发布环境构建完成了,注意本文主要是阐述思路,具体细节还得自己慢慢摸索。