- 浏览: 221044 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Wangwei86609:
非常好的规则引擎框架,支持决策树和多线程运行规则https:/ ...
规则引擎 -
hzxlb910:
真详细,收藏哈
maven setting.xml配置说明 -
东方胜:
[b][/b]
脚本语言 Tcl -
345161974:
hyw520110 写道345161974 写道这个Visua ...
Visual Tcl Binary 完整版(完美中文支持) -
hyw520110:
345161974 写道这个Visual Tcl Binary ...
Visual Tcl Binary 完整版(完美中文支持)
数据库持续集成(Continuous Database Integration, CDBI)是持续集成(Continuous Ingeration, CI)不可或缺的重要组成部分。在典型的情况下,版本控制系统管理数据库脚本,包括数据库定义语言(DDL)和数据库操纵语言(DML)。开发成员在开发过程中添加或者修改数据库脚本,在本地运行过之后,提交至版本控制系统,并由此激发一次持续构建。CI服务器执行数据库脚本,并返回成功或者错误报告。
第18界Jolt大奖,技术类图书获得者: Continuous Integration: Improving Software Quality and Reducing Risk 用一章的篇幅介绍的CDBI的相关概念及实践,并给出了一个基于Ant的样例实现,本文将介绍使用Maven来实现CDBI。
首先简单介绍一下 SQL Maven Plugin ,它通过Maven来执行配置好的数据库脚本,可以通过在POM中配置sql命令,或者将脚本写在文件中,在POM中配置文件位置。最后,运行 mvn sql:execute 以执行所有脚本。
以下通过一个比较完整的例子来解释下该插件的用法,这里例子能在这里找到:http://mojo.codehaus.org/sql-maven-plugin/examples/execute.html
首先,配置对 sql-maven-plugin 的依赖:
- <build>
- [...]
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>sql-maven-plugin</artifactId>
<build> [...] <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>sql-maven-plugin</artifactId>
紧接着,由于该插件需要使用JDBC来执行SQL脚本,因此还需要配置对JDBC驱动的依赖,如:
- <dependencies>
- <!-- specify the dependent jdbc driver here -->
- <dependency>
- <groupId>postgresql</groupId>
- <artifactId>postgresql</artifactId>
- <version>8.1-407.jdbc3</version>
- </dependency>
- </dependencies>
<dependencies> <!-- specify the dependent jdbc driver here --> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</artifactId> <version>8.1-407.jdbc3</version> </dependency> </dependencies>
在此基础上便是数据库的基本配置了,通常包括URL,Username和Password。这是一个通用的配置,默认情况下,在此之后的目标(goal)都会使用这个配置,除非将其覆写。
- <!-- common configuration shared by all executions -->
- <configuration>
- <username>postgres</username>
- <password>password</password>
- <url>jdbc:postgressql://localhost:5432:yourdb</url>
- </configuration>
<!-- common configuration shared by all executions --> <configuration> <username>postgres</username> <password>password</password> <url>jdbc:postgressql://localhost:5432:yourdb</url> </configuration>
典型的脚本包括以下步骤:
- 删除旧数据库
- 创建新数据库
- 创建表,索引等
- 插入初始数据
- 删除数据库
当然我们可以根据具体情况裁剪这些步骤,比如,如果我们需要在一段时间内使用这个脚本创建的干净数据库环境,我们可以不执行最后一步:删除数据库。需要注意的是,执行很多DDL的时候我们一般需要最高的数据库权限。
首先来看一下删除旧数据库,注意这里的URL不是我们上面配置的基本配置,因为我们需要删除'yourdb',因此我们只能使用系统的初始数据库。如果'yourdb'数据库不存在,执行出错,则跳过继续下一步:
- <executions>
- <execution>
- <id>drop-db-before-test-if-any</id>
- <phase>process-test-resources</phase>
- <goals>
- <goal>execute</goal>
- </goals>
- <configuration>
- <!-- need another database to drop the targeted one -->
- <url>jdbc:postgressql://localhost:5432:bootstrapdb</url>
- <autocommit>true</autocommit>
- <sqlCommand>drop database yourdb</sqlCommand>
- <!-- ignore error when database is not avaiable -->
- <onError>continue</onError>
- </configuration>
- </execution>
<executions> <execution> <id>drop-db-before-test-if-any</id> <phase>process-test-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <!-- need another database to drop the targeted one --> <url>jdbc:postgressql://localhost:5432:bootstrapdb</url> <autocommit>true</autocommit> <sqlCommand>drop database yourdb</sqlCommand> <!-- ignore error when database is not avaiable --> <onError>continue</onError> </configuration> </execution>
现在需要创建我们的数据库yourdb,和上面一样,URL指向系统初始数据库,这里的sql comand为建库命令:
- <execution>
- <id>create-db</id>
- <phase>process-test-resources</phase>
- <goals>
- <goal>execute</goal>
- </goals>
- <configuration>
- <url>jdbc:postgressql://localhost:5432:yourdb</url>
- <!-- no transaction -->
- <autocommit>true</autocommit>
- <sqlCommand>create database yourdb</sqlCommand>
- </configuration>
- </execution>
<execution> <id>create-db</id> <phase>process-test-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <url>jdbc:postgressql://localhost:5432:yourdb</url> <!-- no transaction --> <autocommit>true</autocommit> <sqlCommand>create database yourdb</sqlCommand> </configuration> </execution>
然后执行的建表命令,这里配置了srcFiles,我们可以将schema的脚本写在sql文件里,然后配置在这里,顺序执行:
- <execution>
- <id>create-schema</id>
- <phase>process-test-resources</phase>
- <goals>
- <goal>execute</goal>
- </goals>
- <configuration>
- <autocommit>true</autocommit>
- <srcFiles>
- <srcFile>src/main/resourced/your-schema.sql</srcFile>
- </srcFiles>
- </configuration>
- </execution>
<execution> <id>create-schema</id> <phase>process-test-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <autocommit>true</autocommit> <srcFiles> <srcFile>src/main/resourced/your-schema.sql</srcFile> </srcFiles> </configuration> </execution>
DB和Schema没问题之后,我们通常需要插入一些系统的初始数据,或者测试的初始数据:
- <execution>
- <id>create-data</id>
- <phase>process-test-resources</phase>
- <goals>
- <goal>execute</goal>
- </goals>
- <configuration>
- <orderFile>ascending</orderFile>
- <fileset>
- <basedir>${basedir}</basedir>
- <includes>
- <include>test/sql/test-data2.sql</include>
- <include>test/sql/test-data1.sql</include>
- </includes>
- </fileset>
- </configuration>
- </execution>
<execution> <id>create-data</id> <phase>process-test-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <orderFile>ascending</orderFile> <fileset> <basedir>${basedir}</basedir> <includes> <include>test/sql/test-data2.sql</include> <include>test/sql/test-data1.sql</include> </includes> </fileset> </configuration> </execution>
最后,测试完了之后,删除数据库:
- <!-- drop db after test -->
- <execution>
- <id>drop-db-after-test</id>
- <phase>test/phase>
- <goals>
- <goal>execute</goal>
- </goals>
- <configuration>
- <autocommit>true</autocommit>
- <sqlCommand>drop database yourdb</sqlCommand>
- </configuration>
- </execution>
- </executions>
- </plugin>
- [...]
<!-- drop db after test --> <execution> <id>drop-db-after-test</id> <phase>test/phase> <goals> <goal>execute</goal> </goals> <configuration> <autocommit>true</autocommit> <sqlCommand>drop database yourdb</sqlCommand> </configuration> </execution> </executions> </plugin> [...]
最后让我们回头再来看看这个五个步骤,其实它们都用了 sql-maven-plugin 的 execute 目标,除了drop-db-after-test,它们都配置了 process-test-resources 生命周期。这样配置的目的是让删旧库,建库,建表,插数据这些步骤在测试之前完成,这样,测试的时候就有一个完好的数据库了,测试完了之后,再把建好的数据库删除。
通过建一个Maven项目,使用 maven-sql-plugin 管理数据库脚本的执行,然后使用CI服务器来调用这个Maven项目,我们就可以实现基于Maven的CDBI了。
发表评论
-
Maven Artifacts如何部署到仓库
2012-03-28 11:50 989http://www.blogjava.net/lishunl ... -
maven常见问题问答
2011-11-16 13:24 754前言 Maven,发音是[`meivin],"专家 ... -
maven setting.xml配置说明
2011-11-16 12:43 1436setting.xml view plain ... -
Maven实战指南:“打包”的技巧
2011-10-11 10:13 2108http://tech.it168.com/a2011/062 ... -
M2工程 mvn deploy 401 403错误处理
2011-10-10 15:11 1134http://hi.baidu.com/g4_gc/blog ... -
maven部署web工程基础步骤
2011-10-10 12:43 20581.准备工作 下载maven(url:http://a ... -
eclipse maven wtp jar/lib deploy
2011-10-09 09:57 1020eclipse工程(with maven & wtp) ... -
配置Maven web项目
2011-09-13 16:00 9411、创建Web应用 mvn archetype:genera ... -
maven报错:mvn deploy
2011-09-09 14:01 1695一.Error deploying artifact: ... -
maven配置篇之pom.xml
2011-09-08 15:24 823说完了settings.xml配置, ... -
简述maven中的profiles
2011-09-08 15:06 1013Profiles是maven的一个很关键的术语:profile ... -
maven项目添加jar包.
2011-08-16 09:31 1159很多新手都不知道如何在maven项目里添加jar包. 以前我还 ... -
Hudson+Maven+SVN 快速搭建持续集成环境
2011-05-26 14:09 1023原: http://www.blogjava.net ... -
基于maven和hudson打造持续集成环境
2011-05-26 12:58 1128对持续集成的需求 对持续集成的需求主要来自项目过程的痛,在 ... -
maven 配置篇 之 settings.xml
2011-05-24 20:36 879maven2 比起maven1 来说,需要配置的文件少多了,主 ... -
Maven生命周期详解
2011-05-24 17:47 689Maven强大的一个重要的 ... -
激活Maven profile的几种方式
2011-05-24 17:43 858首先简单介绍下 Maven 的 profile 是什么。对于人 ... -
使用Profile和Resources Filter隔离测试环境
2011-05-24 17:42 822Maven能够帮我们很好的 ... -
Maven最佳实践:版本管理
2011-05-24 16:32 833原文:http://juvenshun.iteye ... -
Maven仓库
2011-05-24 16:30 883什么是Maven仓库 在不用Maven的时候,比如说以前我们 ...
相关推荐
本文详细介绍了exec-maven-plugin的基本概念、配置方法、执行简单和系统脚本、捕获命令输出、条件执行、并发执行、使用环境变量、错误处理、高级配置、使用案例以及局限性。通过这些知识点,读者可以更加自信地在...
Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-plugin 来实现 Maven 项目与 Tomcat 服务器的集成。下面我们将详细介绍如何使用 tomcat8-maven-plugin 插件。 tomcat8-maven-plugin 插件的...
本文将详细讨论如何将Jetty与Maven进行集成,并介绍关键的`maven-jetty-plugin`插件及其不同版本。 1. Maven与Jetty集成的意义: Maven通过其强大的依赖管理功能,使得项目构建变得简单和规范。而Jetty作为轻量级...
`maven-compiler-plugin-3.8.0-source-release` 是 Maven 生态系统中不可或缺的一部分,它提供了可靠的源代码编译功能,使得开发者能够专注于编写代码,而无需关心构建过程的细节。通过理解 Maven 插件的工作原理和...
本项目是基于Java的smart-doc-maven-plugin官方maven插件设计源码,包含43个文件,其中包括27个Java源文件、7个Markdown文档、2个JSON文件、1个gitignore文件、1个LICENSE文件、1个NOTICE文件、1个PNG图片文件、1个...
maven-deploy-plugin-2.8.2.jar
2. **运行SQL脚本**:`maven-db-plugin` 支持执行 SQL 脚本来更新数据库结构,如创建表、索引、视图等,或者填充测试数据。 3. **清理数据库**:可以用于删除所有数据库对象,或者执行特定的清理脚本,以便在每次...
maven-jar-plugin-3.1.1.jar
maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配,以至于可能导致编译不通过的问题。...
maven-site-plugin-3.3.jar
maven-antrun-plugin-3.0.0.jar
maven-clean-plugin-3.1.0.jar
当我们谈论`tomcat7-maven-plugin-2.2.jar`时,这实际上是Maven的一个插件,它允许开发者直接在Maven环境中集成和管理Tomcat服务器,从而实现快速部署和调试。 这个"修改版"的`tomcat7-maven-plugin-2.2.jar`可能...
maven-surefire-plugin-2.22.1.jar
maven-install-plugin-2.4.jar
maven-jxr-plugin-2.1.jar
当maven-site-plugin和maven-scr-plugin同时使用时,可能遇到的问题是,site plugin试图清理target目录以准备生成新的站点文档,但因为maven-scr-plugin生成的服务元数据(通常位于target/OSGI-INF/serviceComposite...
maven-deploy-plugin-2.7.jar
maven-assembly-plugin-2.2-beta-5.jar
<artifactId>maven-jetty-plugin 版本号 <!-- 配置项 --> </plugin> ... ``` 总的来说,Maven Jetty Plugin是Java Web开发者的重要工具,它简化了开发流程,提高了效率,同时也为持续集成和持续部署...