Droolsのruleファイルの宣言構造

droolsではルールは基本的にdrlファイルに書いていきます。when+then以外に目をむけるとサンプルみても、何この構文?ってなっちゃいます。でも大きい構造をふまえてちょっと分解するだけで少し読みやすくなります。大きくはこういう構造です。

package package-name
・・・
imports
・・・
globals
・・・
functions
・・・
queries
・・・
rules
・・・

packageはjavaに近いですね、namespace的な位置づけです。細かいことはあとでも書くと思うけどdrl,xmlファイルからASTつかって最終的にpackageというルールの集まりを作ります。その時にルールエンジン上で一意になる名前がコレになりますですよ。
importsもjavaと一緒です。javaのルールエンジンなのでjavaとの連携が当然シームレスに行われないとダメなんです。その時にはバシっとimportです。
globalsはグローバル変数の宣言です。複数パッケージ間で共有されます。
functionsはファンクション、関数です。うわー、このルール共通化してまとめたい、このルールファイル上でーって時に使います。複雑な部分になるとjavaでやったりdroolsのルールでやったりする境界がどっちつかずみたいなところがでてくるときもあるかと思います。その際にdrlでまとめたくなったら間違いなくfunctionで宣言です。
queryもクエリー、そのまんまです。
で、最後のrulesにてルールを書くとなっています。大きい構文はこうなってます。ちなみにrulesの中のルールの構文はこんな感じ。

rule "name"
    attributes
when
    LHS
then
    RHS
end

ルール名があってどんな時(when)、何すんねん(then)で書きます。というのを書いたのがruleの基本構造であります、っていうか一目瞭然(モア風)

Drools5でコンパイラをJANINOにする方法

Droolsのルールをコンパイルするのにコンパイラを指定する必要があります。デフォルトはEclipseJDTになっています。で、プログラム実行時に以下のようなExceptionが出ることがあります。

The Eclipse JDT Core jar is not in the classpath.

回避策は2つ
1.JANINOに変更する
2.classpathを外部jarで通す。
2.の方はeclipseのpluginフォルダにorg.eclipse.jdt.core_3.4.X.jarではじまるのがあるのでそこに通せばOK.もしくはDroolsをインストールしたbin/libの中に関係する依存jarが入っており,その中でcore-3.4.2.v_883_R34x.jarがあるのでそれを利用する。
今回は1.の方についてちょっと触れる

KnowledgeBuilderConfiguration config = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
config.setProperty("drools.dialect.java.compiler", "JANINO");
KnowledgeBuilder kbuilder =
  KnowledgeBuilderFactory.newKnowledgeBuilder( config );		

というのが新APIでの設定方法らしい。undocumentedだったので確認したらjavadocに追加してくれました。でもこれだけでも動かずで結局はclasspathの通っている場所でMETA-INFをおいてdrools.packagebuilder.confを作成してdrools.dialect.java.compiler = JANINOを記述。それで実行するとOK!
でもソースをみるとどうもあやしいのでMETA-INFのところはそのままにして上記APIの記述をコメントにしてみました(configのところを特に何もしない記述)。それで実行してみたらやっぱり動いてしまいました。。。Sources tell everything、ということにしておきますw