1. 需要事先安装好下面这些工具
JDK 1.5+
TortoiseSVN 1.7+
Eclipse 3.5+
2. 下载H2数据库的源代码
H2数据库的源代码放在Google code: http://h2database.googlecode.com/svn
目前最新的版本是1.3.168,所有的版本可以在svn的tags目录中找到,
因为H2目前比较稳定了,代码提交频率不是很高,不过也会有一些更新,
为了能保持与H2作者同步,所以这里我们选用trunk里的代码:
http://h2database.googlecode.com/svn/trunk/h2
可以直接用浏览器打开这个URL,或者用TortoiseSVN的Repository Browser打开它。
如下图所示:
用TortoiseSVN checkout这个svn的代码: http://h2database.googlecode.com/svn/trunk/h2
放到E:\H2\trunk (你可以换别的目录,但是要修改下文中与之相关的地方)
3. 一些好习惯
我每次看一个新的开源项目时,都会写一新的代码例子还有各种分析文档,然后要及时提交到本地svn中以免丢失,
比如我在E:\H2建了一个目录my-h2,此目录中还有两个子目录: my-h2-src、my-h2-docs
my-h2-src用来放我自己分析代码时写的各种例子,
my-h2-docs放一些分析文档。
4. 导入Eclipse
H2不是一个用maven构建的项目,也没用ant,它用Java自己写了一个构建程序,
不过我感觉有些复杂,所以也没用它的,还是直接修改Eclipse项目脚本比较简单。
H2有一些编译期依赖,比如lucene、servlet、jdk tools等,
所以可以在E:\H2中建个lib目录,把所有的依赖jar包放到里面。(注: 这些jar在此文最后的附件中有)
因为H2也可以区分Client和Server端,所以为了方便调试分析代码,可以建立两个Eclipse workspace,
这两个Eclipse workspace的".classpath"和".project"文件可以完全一样。(注: 这两个文件在此文最后的附件中有)
".project"文件:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>h2</name>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
<linkedResources>
<link>
<name>my-h2-src</name>
<type>2</type>
<location>E:/H2/my-h2/my-h2-src</location>
</link>
<link>
<name>h2-main-src</name>
<type>2</type>
<location>E:/H2/trunk/src/main</location>
</link>
<link>
<name>h2-tools-src</name>
<type>2</type>
<location>E:/H2/trunk/src/tools</location>
</link>
<link>
<name>h2-test-src</name>
<type>2</type>
<location>E:/H2/trunk/src/test</location>
</link>
</linkedResources>
</projectDescription>
使用了linkedResources,这样多个Eclipse workspace可以共享同样的Java源代码,无论在哪个workspace中改了在另一边都能察觉到。
".classpath"文件:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="my-h2-src"/>
<classpathentry kind="src" path="h2-main-src"/>
<classpathentry kind="src" path="h2-tools-src"/>
<classpathentry kind="src" path="h2-test-src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="E:/H2/lib/junit-4.8.2.jar"/>
<classpathentry kind="lib" path="E:/H2/lib/lucene-core-3.4.0.jar"/>
<classpathentry kind="lib" path="E:/H2/lib/org.eclipse.osgi_3.6.2.R36x_v20110210.jar"/>
<classpathentry kind="lib" path="E:/H2/lib/servlet-api-2.4.jar"/>
<classpathentry kind="lib" path="E:/H2/lib/slf4j-api-1.6.1.jar"/>
<classpathentry kind="lib" path="E:/H2/lib/tools.jar"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
前4个src条目都是对前面linkedResources中的引用。
接着在E:\H2中建立两个目录: eclipse-workspace-server、eclipse-workspace-client,
然后把上面两个文件都copy一份到这两个目录中。
紧接着,打开Eclipse,出来一个"Workspace Launcher"框,编辑一下,改成h2-server,这样就会得到一个新的Workspace,
进入Eclipse后,点"File->Import->General->Existing Projects into Workspace",
最后打开E:\H2\eclipse-workspace-server就能看到H2这个项目了。
再打开Eclipse,出来一个"Workspace Launcher"框,编辑一下,改成h2-client,这样就会得到一个新的h2-client Workspace,
进入Eclipse后,点"File->Import->General->Existing Projects into Workspace",
最后打开E:\H2\eclipse-workspace-client也能看到H2这个项目。
5. 在Eclipse中让H2跑起来
在h2-server那个workspace中,在my-h2-src下新建一个类,如下:
package my.test;
import java.sql.SQLException;
import java.util.ArrayList;
public class MyServer {
public static void main(String[] args) throws SQLException {
ArrayList<String> list = new ArrayList<String>();
list.add("-tcp");
org.h2.tools.Server.main(list.toArray(new String[list.size()]));
}
}
在编辑区右击,点"Run As->Java Aplication",
如果在Console中出现"TCP server running at..."这样的提示就表示H2 Server起动正常了。
然后转到h2-client那个eclipse workspace,在my-h2-src下新建一个类,如下:
package my.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost:9092/mydb", "sa", "");
Statement stmt = conn.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS my_table");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS my_table(name varchar(20))");
stmt.executeUpdate("INSERT INTO my_table(name) VALUES('zhh')");
ResultSet rs = stmt.executeQuery("SELECT name FROM my_table");
rs.next();
System.out.println(rs.getString(1));
stmt.close();
conn.close();
}
}
在编辑区右击,点"Run As->Java Aplication",
如果在Console中出现"zhh"这样的提示就表示H2 Client也正常了。
另外,转到E:\H2\eclipse-workspace-server目录,会发现在此目录中多了一个mydb.h2.db文件,my_table的数据也放在此文件中。
6. H2代码调试简单入门
直接点Eclipse中那个红色的Terminate按钮停掉h2-server,
然后在my.test.MyServer类的编辑区右击,点"Debug As->Java Aplication",
启动完后,在org.h2.server.TcpServer.listen()方法中打个断点,如下图:
重新运行上面的JDBCTest例子,在h2-server的org.h2.server.TcpServer中就进入断点了,
在h2-server的org.h2.command.Parser.parse(String)中再设个新断点,然后按F8会跳到里面。