Hi,
While trying to get some integration tests of the Maven Drools
Plugin green when used with Drools 5.2.0.Final and 5.3.0.Beta1, I'm
getting weird behaviour of the newer Drools version when it comes to
deserializing KnowledgePackages.
What do I do in the code?
- compile three *.drl files (see below)
- serialize the resulting KnowledgePackages using
DroolsStreamUtils.streamOut(new FileOutputStream(outputFile),
knowledgeBuilder.getKnowledgePackages(), false) from within the
plugin (see [1], [2])
- de-serialize the knowledge packages using
DroolsStreamUtils.streamIn(new FileInputStream(file)) in a TestNG
test [3], using [4]
- I get java.lang.ClassNotFoundException for a declared data type:
java.lang.ClassNotFoundException: model.Age
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at
org.drools.common.DroolsObjectInputStream.resolveClass(DroolsObjectInputStream.java:85)
at
org.drools.common.DroolsObjectInputStream.resolveClass(DroolsObjectInputStream.java:97)
at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
Strangely enough, the same code works well if I switch to Drools
5.1.1. What changed between 5.1.1 and 5.2.0.Final that might cause
this effect? Might I be doing something wrong using
DroolsStreamUtils?
Would be happy about any hints.
Thank you in advance.
Here are the three input files, which get compiled exactly in this
order:
1) Person.drl
package model;
declare Person
name: String
end
2) Age.drl
package model;
declare Age
person: Person
age: Integer
end
3) minimum-age.drl:
package rules;
dialect "mvel"
import model.Person;
import model.Age;
rule "check minimum age"
when
Age( $person: person, age < 18 )
then
insertLogical("TOO YOUNG: " + $person.name )
end
Best regards
Ansgar
[1] https://github.com/maven-drools/plugin.maven-drools-plugin/blob/57c77fce26ceac41256e7f70c4e4daa2f411de4f/mojos/src/main/java/de/lightful/maven/plugins/drools/mojos/CompileMojo.java
[2] https://github.com/maven-drools/plugin.maven-drools-plugin/blob/57c77fce26ceac41256e7f70c4e4daa2f411de4f/mojos/src/main/java/de/lightful/maven/plugins/drools/impl/OutputFileWriter.java
[3] https://github.com/maven-drools/plugin.maven-drools-plugin/blob/57c77fce26ceac41256e7f70c4e4daa2f411de4f/generic-integration-test-bundle/src/test/java/de/lightful/maven/plugins/drools/integrationtests/CanPerformMultiplePassesTest.java
[4] https://github.com/maven-drools/plugin.knowledge-io/blob/a89bcf581d75b2ac8dfd55122c140568dbb8756a/src/main/java/de/lightful/maven/plugins/drools/knowledgeio/KnowledgePackageFile.java