学习任何新得事物最好的方式就是去尝试。因此,在本章节,我们开始切入编写和执行我们第一个规则。我们将会涵盖大多数关于规则语言重要的点,如何高效的编写对你领域有意义的规则。这个章节将会使用前一章介绍的eShop的模型来演示一系列规则应用的场景。
在我们开始编写之前,在这章的前半部分,你会学到如何安装使用Drools所需要的所有的标准工具和这本书提供的示例。你将会从头开始创建项目,因此,你会用到本章作为从头开始创建应用的参考。第二半部分,我们会涵盖DRL语言的介绍,当你使用规则或其他知识断言(比如业务流)时建议你如何组织项目。
对上面简单介绍下,本章节将涵盖一下主题:
- 安装环境
- 创建第一个Drools项目
- 编写和执行第一个规则
- 讨论DRL规则语言
- 组织项目
安装环境
为了开始使用规则,我们需要考虑这些问题。首先我们将会依赖Maven来为我们的项目提供结构。如果你对它不熟悉,我强烈建议你了解下Maven, 因为Drools和JPMN大多数基础设施是依赖的Maven的。因此,当你明白它是如何使用的,你会感觉到非常的舒服。如果你是Maven的新手,我建议你看下Maven工程的站点链接
https://maven.apache.org/guides/getting-started/index.html
对于Drools来讲它不是一定需要的,但是还是建议使用它。大多数工程工具和其他模块的集成,依赖Maven服务器作为项目结构、项目生命周期和依赖管理的标准。
开始之前,我们需要确认以下软件是否在电脑上已经安装完毕:
- jdk1.8,注意Drools并不需要jdk1.8,但是书中的示例是需要使用它的。为了避免在示例中遇到问题,我们建议你使用这个版本
- 使用Maven3.1.*对我们的项目进行编译、构建、测试
- 源码管理上使用GIT1.9.*或更高的版本
我们将会使用git获取托管在Bitbucket仓库中的示例工程,如果你对git不熟悉,我建议您好好看一下git的官方文档。
http://git-scm.com/docs
为了可以在本地环境中获取一份复制的示例工程,我们将会在终端执行命令去克隆在远程仓库中的示例。
git clone https://bitbucket.org/drools-6-developer-guide/drools6-dev-guide.git
执行的时候依托于你的操作系统,你需要使用git客户端与远程仓库进行交互。这里是git项目提供的列表,你可以随意选择适合你操作系统的方案
http://git-scm.com/downloads/guis
现在,你的本地环境已经有了这本书的所有的示例副本。确认下所有的事情现在都已经安装,去drools6-dev-guide/文件夹下,执行mvn clean install。这个命令是告诉maven从工程中清除掉所有之前编译的类、打包的资源文件,并开始一个新的编译进程。为了可以成功编译,maven需要确认该工程需要的第三方依赖。对我们而言,drools也是第三方库,如果本地没有的话,我们将需要从通过maven进行下载。而且,它不光可以编译Java class,还可以执行工程中定义的所有的测试类,并且如果所有测试都成功的话,还能对工程进行打包。
在你的本地环境第一次执行的时候,这个进程会进行下载,编译并执行所有的测试。这是主要是由于这是第一次下载,除非你是用SNAPTHOTS,这只会发生在你第一次执行命令时。注意,托管示例的仓库没有承载任何第三方库,甚至也没有Drools。
现在我们知道JDK和Maven的正确的工作方式,我们准备去创建我们第一个Drools工程把。
创建第一个Drools工程
正如前面的章节提及的那样,我们使用Maven提供给我们的工程结构。针对这个,Maven提供了骨架的概念,骨架就是我们用来引导工程的模板。大部分IDE为了创建和初始化工程都提供了让我们使用骨架的方式。请检查你的IDES是否已经下载了你需要的Maven插件或已经绑定了Maven。如果你想使用命令行来实现这个这个操作,你可以执行下面的命令:
mvn -B archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=org.drools.devguide
-DartifactId=myfirst-drools-project
建议你在文件夹drools6-dev-guide/chapter-02/下执行这个命令。这会让Maven继承定义在其父工程drools6-dev-guide/pom.xml中的所有配置。如果你这么做了,你的工程将会知道本书中所有其他示例中Drools的版本,这样就会避免你在下面的章节中再定义其他的Drools版本。
注意,你可以改变groupId的值,它表示你应用所属的逻辑组,还有artifactId,它表示你特定的Maven模板的名字。这个命令会让你在文件夹 myfirst-drools-project下创建一个工程。
一旦我们执行了这个命令,一个新的工程结构就已经为我们准备好了。这个结构就像下面图中表示的差不多
下面是一些非常重要的事情:
pom.xml:它包含了工程的定义和一级依赖。强烈建议你打开这个文件并好好看看它。你需要去了解如何改变pom文件来导入新的依赖或改变工程配置。
- src/main/java:它包含了所有需要编译的Java类。
- src/test/java:它包含了所有需要编译的测试类,并在测试期间执行。
- src/main/resources:它包含了所有不需要编译的静态资源文件,因此它需要独立于Java类打包。
- src/test/resources:它包含了所有不需要编译的静态测试资源文件,因此我们的测试类需要它。
这个基础结构服务作为任何一个Java工程的起点,无论你在工程里使用什么框架。为了能在工程中使用Drools,我们需要在pom.xml中定义框架的依赖。为了使用Drools,我们需要在工程中添加下面的依赖(在dependencies标签中)。
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.drools.devguide</groupId>
<artifactId>chapter-02</artifactId>
<version>1.0</version>
</parent>
<artifactId>myfirst-drools-project</artifactId>
<dependencies>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
</dependency>
</dependencies>
</project>
第一个kie-api包含了由Drools、JBPM和OptaPlanner组成的KIE平台暴漏的所有接口。下一个我们包含了org.drools:drools-core租组件,它包含了规则引擎的实现。最后我们包含了 org.drools:drools-compiler组件,它包含了将写在不同资源下(txt、表格、自定义类型等)要规则翻译成可执行规则的算法。这个组件是必须的,因为我们需要编译在工程中的规则。我们可以将规则编译从规则执行中区分开,以从工程中移除该依赖。因此为了简单起见,我们将会在相同的工程中编译我们的规则。
为了针对我们的领域开始编写规则,我们将要向它添加一个依赖。如下所示,这个依赖定义了本书示例中提供的领域模型。
<dependencies>
(... Drools dependencies here … )
<dependency>
<groupId>org.drools.devguide</groupId>
<artifactId>model</artifactId>
</dependency>
</dependencies>
正如我们将要在下一章节看到的那样,通过这种方法,我们可以添加我们想要的很多依赖,并且可以直接使用第三方库提供的类。为了完成我们工程的配置,这是最后一件需要做的事情,在文件夹中chapter-02/myfirst-drools-project/src/
main/resources/META-INF/中定义的名字为kmodule.xml的文件。这个文件将会用来配置如何加载定义在使用drools的工程中的规则。现在来说,因为我们将要使用的所有的默认的配置,kmodule.xml中的内容是非常简单。下面就是一个空的kmodule.xml文件的示例。
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://jboss.org/kie/6.0.0/kmodule">
</kmodule>
我们将会在第三章看到如何自定义该文件更细粒度的设置。当我们自动初始化规则引擎的session来断定需要加载的内容时,这个文件将会被搜取。