从头开始学Shark II –
启动引擎和登陆
(宏云翻译,Cygnet开源工作流组, 2005-4-15 )
原文地址:http://shark.objectweb.org/doc/sfs/sharkfromscratch2.html
在这篇文档中,我简单描述实例代码的创建。和以前一样,我不打算涉及和本文不直接相关的所有主题。首先,你必须了解如何去编写、编译和执行Java程序。另外,你需要有一个Shark的运行版,并且能够使用Shark提供的管理程序。
和以前一样,我已经安装了以下程序:
- MySQL –我使用 4.0.16 -nt
- MySQL Connector – 我使用mysql-connector-java- 3.0.11 -stable-bin.jar
- Ant 1.6.x – 不是必需的,但是我提供了一个build file....
- Java – 我使用Sun j2sdk version 1.4.2 _04
- CVS, Winzip, 等其他需要的软件。
在执行以下命令后,我的Shark build安装在C:/Shark目录下
make -install
我使用的策略是重复构造一些类(class)来示范如何在Shark中广泛使用。接口是Main method之外的一个命令行。这样做的目的是让新用户可以很容易地开始,并舒适地为Shark进行编码。
文件
你可以阅读这些文件,并且点击指向源码的链接,它是通过Java2html Java2Html ( www.java2html.com )产生的。另外,我已经提供了源码和Ant Build文件。可以在这里找到它们here.
开始使用Shark
开始使用Shark如下所示一样简单:
Shark.configure(new Properties("Shark.conf"));
也就是说,首先要配置Shark (见Shark from Scratch(从头开始学习Shark))。那么,你需要确保所有的Jar文件都是可用的。我们这里构建的代码并不在Shark目录下。
能够启动Shark的最小jar文件集合是(根据我的配置):
- C:/Shark/lib/sharkkernel-standard.jar
- C:/Shark/lib/sharkclientapi.jar
- C:/Shark/lib/sharkcommonapi.jar
- C:/Shark/lib/sharkinternalapi.jar
- C:/Shark/lib/sharkxpdl-standard.jar
- C:/Shark/lib/sharkinstancepersistence-dods.jar
- C:/Shark/lib/dods-runtime.jar
- C:/Shark/lib/util.jar
- C:/Shark/lib/sharkutilities-dods.jar
- C:/Shark/lib/mysql-connector-java- 3.0.11 -stable-bin.jar
- C:/Shark/lib/sharkrepositorypersistence-dods.jar
- C:/Shark/lib/sharkscripting-standard.jar
- C:/Shark/lib/sharkutilities-map.jar
- C:/Shark/lib/sharkutilities-misc.jar
- C:/Shark/lib/xercesImpl.jar
- C:/Shark/lib/xml-apis.jar
构建实例
因为代码量很小, 所以我把它列到这里,让大家可以深入了解。当然,同时我提供了所有的源代码和一个脚本文件,见here. 这个例子在first
包中可以找到。
运行"ant -p"来看一下目标达成情况。如果你不是使用c:/Shark作为你的安装目录, 你必须在你的构建脚本文件中改变shark.dir
的属性值。我们运行的类叫 Simple
。
在运行之前,让我们来看看代码:
package first;
import org.enhydra.shark.Shark;
import java.util.Properties;
import java.io.FileInputStream;
/**
* Does nothing more than start the Shark engine.
*/
public class Simple
{
public static void main(String[] args)
{
try
{
Properties props = new Properties();
props.load(new FileInputStream("C://Shark//Shark.conf"));
System.out.println("Enginename from Shark.conf is : " + props.getProperty("enginename"));
// Make SURE every instance of shark that connects to the same database uses a different
// enginename.
props.setProperty("enginename", "rross");
Shark.configure(props);
}
catch (Exception e)
{
// It's not like I am going to revive the thing if it crashes...
e.printStackTrace();
}
}
}
代码相当简单,它实现装载properties文件,提供一个不同的引擎名称并把属性对象传递给Shark。
启动你的引擎
要运行它,只要在Dos命令中输入"ant runFirst"即可。当执行命令后,要看一下随后的输出
C:/dev/SharkFromScratch>ant runFirst
Buildfile: build.xml
runFirst:
[java] Enginename from Shark.conf is : Shark
[java] SharkEngineManager -> Shark engine is being initialized ...
[java] File dodsConf.xml not exists on path: 'dodsconf' using default insted
[java] Shark -> Initializing of shark engine has finished
[java] Shark -> Initializing lasted 5 [s]
[java] Shark -> firstEngine ready and waiting ...
BUILD SUCCESSFUL
Total time: 6 seconds
除了一个异常之外,其他都很正常。这个异常是“File dodsConf.xml not exists on path: 'dodsconf' using default insted"。忽略语法和拼写错误,就是说,不能找到dodsConf.xml的备份。如果我在Shark目录下做一个快速搜索,我能看到dodsConf.xml 确实存在。发生的问题是Shark.conf文件有一个缺省的相对路径,当你在包含build文件的目录(我这里是C:/dev/SharkfromScratch)下运行时,Shark能够找到所有的配置文件和其他信息。
修补配置文件
不是编辑硬盘上的Shark.conf文件,而是编辑在启动时传递给Shark引擎的各种属性。这使得我能够更好地控制什么会参与进来,使得我能够在应用(如runsa.bat)中继续使用“官方的(official)”Shark.conf文件,而不用经常改动它。
在交付给Shark之前,我会装载属性文件并预先考虑属性中所有相关文件名称的Shark安装目录。
在second.Simple
中, 你能够看到上述情况。它并不是不可思议的,我已经硬编码了Shark的安装路径,它确实是完成了工作。
运行它,你会得到以下的输出(或者非常相似)
C:/dev/SharkFromScratch>ant runSecond
Buildfile: build.xml
runSecond:
[java] Fixing up Shark config
[java] SharkEngineManager -> Shark engine is being initialized ...
[java] Shark -> Initializing of shark engine has finished
[java] Shark -> Initializing lasted 5 [s]
[java] Shark -> secondEngine ready and waiting ...
BUILD SUCCESSFUL
Total time: 6 seconds
正如你看到一样,Shark不再因为找不到dodsConf.xml文件而备受抱怨。在这一点上,我们正确启动了Shark。
深入钻研Shark
既然我们能够启动Shark,让我们来看一下我们能够得到什么。Third包是我们第一次尝试构建一个程序。Workflow类提供一个称作init的方法,这个方法包含了到目前为止我们已经做的工作。
登录
下一步, 我们进行登录。实际上,我们要做的是获得一个SharkConnection对象,我们称作它的connect method. 这一代码片段来自login
方法。
SharkConnection conn = Shark.getInstance().getSharkConnection();
try
{
conn.connect(userName, password, props.getProperty("enginename"), null);
}
连接命令的第四个参数是’scope’,但是上次检查中我发现它没有和任何东西相连。在提供的build.xml文件中,使用"runThird",我们应改可以看到下面的结果。
C:/dev/SharkFromScratch>ant runThird
Buildfile: build.xml
runThird:
[java] Fixing up Shark config
[java] SharkEngineManager -> Shark engine is being initialized ...
[java] Shark -> Initializing of shark engine has finished
[java] Shark -> Initializing lasted 5 [s]
[java] Shark -> thirdEngine ready and waiting ...
BUILD SUCCESSFUL
Total time: 6 seconds
你们可能注意到在登录的时候,系统没有提供新的信息。这很好,因为连接不是空的,且没有异常抛出,因此我们继续进行。
在调用recreateDB之后,这个新的数据库实际上还没有任何用户,注意到这一点是很重要的。如果你还没有这样做,你可以运行Shark Swing应用程序(我这里是C:/Shark/runsa.bat),并且使用用户名”admin”和密码"enhydra"登录。这样就会创建”admin”用户。实际上,如果你用未知的用户名登录Swing应用程序,它就会按照你提供的用户名和密码来创建一个新的用户
Classpaths
在提供的build.xml文件中,所有的目标具有相同的class path,但是正如你看到的那样,我前面已经进行了评议,以便你可以在任何点上,都能够判断需要什么文件。对于一个特定的安装来说,并不是Shark产生的所有文件都是必需的,因此,这会帮助你稍微整理一下你的class path.