Folks, it seems that something new in 5.5.0.CR1 sabotages the ingestion of compiled packages. -W
---------- Forwarded message ---------- From: Willem van Asperen <wil...@van.asperen.org> Date: Thu, 25 Oct 2012 00:04:32 +0200 Subject: Re: [rules-users] ClassNotFound on class defined in drl with 5.5.0.CR1 To: Wolfgang Laun <wolfgang.l...@gmail.com>, Rules Users List <rules-us...@lists.jboss.org> Hi, This was a good idea. Here is my test case: public class TestCompilation { private final static FileFilter RULES_FILES_FILTER = new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getName().endsWith(".drl"); } }; private void testCompilation() throws FileNotFoundException, IOException { KnowledgeBuilderConfiguration configuration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(configuration); File folder = new File("src/main/rules/"); for (File file : folder.listFiles(RULES_FILES_FILTER)) { System.out.println("compiling "+file.getAbsolutePath()); kbuilder.add(ResourceFactory.newFileResource(file.getAbsolutePath()), ResourceType.DRL); } System.out.println("saving"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.drl.compiled")); out.writeObject( kbuilder.getKnowledgePackages()); out.close(); } private KnowledgeBase testLoad() throws FileNotFoundException, IOException, ClassNotFoundException { Properties configProperties = new Properties(); KnowledgeBaseConfiguration knowledgeBaseConfiguration = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(configProperties); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(knowledgeBaseConfiguration); ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.drl.compiled")); System.out.println("loading"); kbase.addKnowledgePackages((Collection<KnowledgePackage>) in.readObject()); return kbase; } public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { TestCompilation testCompilation = new TestCompilation(); testCompilation.testCompilation(); testCompilation.testLoad(); } } The folder src/main/rules consists of a number of .drl files. Compiling works fine. This is the output: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. compiling /home/willem/development/workspace/VCM/src/main/rules/planner-lock.drl compiling /home/willem/development/workspace/VCM/src/main/rules/executable-action-selection.drl compiling /home/willem/development/workspace/VCM/src/main/rules/block-times-3.drl compiling /home/willem/development/workspace/VCM/src/main/rules/planner-bridge.drl compiling /home/willem/development/workspace/VCM/src/main/rules/routeplan.drl compiling /home/willem/development/workspace/VCM/src/main/rules/shift-management-brabant.drl compiling /home/willem/development/workspace/VCM/src/main/rules/plan-first-object-in-route.drl compiling /home/willem/development/workspace/VCM/src/main/rules/operator-lock.drl compiling /home/willem/development/workspace/VCM/src/main/rules/block-times-route-call.drl compiling /home/willem/development/workspace/VCM/src/main/rules/shift-management.drl compiling /home/willem/development/workspace/VCM/src/main/rules/planner-process-data.drl compiling /home/willem/development/workspace/VCM/src/main/rules/plan-last-moment.drl compiling /home/willem/development/workspace/VCM/src/main/rules/operator-bridge.drl compiling /home/willem/development/workspace/VCM/src/main/rules/operator-management.drl saving loading Exception in thread "main" java.lang.ClassNotFoundException: vcm.planner.lock.standard.PossibleSlotLock at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) 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:1593) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1480) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1330) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.drools.rule.ConsequenceMetaData$Statement.readExternal(ConsequenceMetaData.java:61) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at java.util.ArrayList.readObject(ArrayList.java:733) at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.drools.rule.ConsequenceMetaData.readExternal(ConsequenceMetaData.java:19) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.drools.rule.Rule.readExternal(Rule.java:207) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.drools.rule.JavaDialectRuntimeData.readExternal(JavaDialectRuntimeData.java:195) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at java.util.HashMap.readObject(HashMap.java:1155) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.drools.rule.DialectRuntimeRegistry.readExternal(DialectRuntimeRegistry.java:58) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.drools.rule.Package.readExternal(Package.java:208) at org.drools.definitions.impl.KnowledgePackageImp.readExternal(KnowledgePackageImp.java:157) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at java.util.ArrayList.readObject(ArrayList.java:733) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at com.paconsulting.pase.test.TestCompilation.testLoad(TestCompilation.java:57) at com.paconsulting.pase.test.TestCompilation.main(TestCompilation.java:64) The class PossibleSlotLock is just a locally declared fact class. It is only being used in that particular .drl file. Every .drl file has it's own package name. The head of the .drl file: package vcm.planner.lock.standard; import java.util.Set; import com.paconsulting.pase.core.schedule.CurrentTime; import com.paconsulting.pase.core.duration.FixedDuration; import com.paconsulting.pase.transport.agents.ScheduleManagingContainer; import com.paconsulting.pase.transport.agents.movers.Ship; import com.paconsulting.pase.transport.agents.water.Lock; import com.paconsulting.pase.transport.agents.water.LockChamber; import com.paconsulting.pase.transport.agents.base.WaterLevel; import com.paconsulting.pase.transport.components.action.ActionFactory; import com.paconsulting.pase.transport.actions.IAction; import com.paconsulting.pase.transport.components.action.IActionable; import com.paconsulting.pase.transport.actions.NonTransactionAction; import com.paconsulting.pase.transport.actions.ExecutableAction; import com.paconsulting.pase.transport.components.containing.IContainer; import com.paconsulting.pase.transport.components.containing.IContainer.UpDown; import com.paconsulting.pase.transport.components.moving.IMover; import com.paconsulting.pase.transport.components.moving.TransferSchedule; import com.paconsulting.pase.transport.components.moving.ToScheduleLock; declare PossibleSlotLock ship : IMover chamber : IContainer side : IContainer.UpDown schedule : TransferSchedule eta : double at : double cause : String end .... Same issue like in my previous email, different class that cannot be found. This works in 5.4.0.Final Any clue? This seems to me like a really basic thing so either I am missing the plot somehow or no-one has yet used a locally declared fact classes - which I think is just not true... Regards, Willem On 10/24/2012 07:29 PM, Wolfgang Laun wrote: > It would be interesting to know (and perhaps help to isolate the problem > apparently introduced in 5.5.0) if you could try and compile and > serialize into a single file, and load that in a single readObject. > > -W > > On 24/10/2012, Willem van Asperen <wil...@van.asperen.org> wrote: >> Hi Wolfgang, >> >> Thanks for picking this up. I am indeed compiling these separate .drl >> files into separate .drl.compiled files and then creating a kbase using >> addKnowledgePackages on the individual .drl.compiled files. >> >> But: the classes declared in some of by .drl files are only going to be >> used in that particular .drl file - not anywhere else. >> Also: this did work in 5.4.0.Final but now has given up on me. >> >> Point is that I need to be flexible in mixing different .drl.compiled >> files into a kbase, based on user specifications. >> Alternative is that I do not pre-compile these .drl files and only >> compile them, in combination, in the mix that is required by the user... >> If that would solve the problem... But it seems to be more cumbersome... >> >> Regards, >> Willem >> >> On 10/24/2012 03:39 PM, Wolfgang Laun wrote: >>> The code you use for loading where you load many .pkg files isn't >>> quite the counterpart for compiling where you compile one DRL. >>> >>> Do you compile and output the .drl files one by one? Apparently you >>> load them individually? >>> >>> Try compiling them all, and then take the Collection<KnowledgePackage> >>> and writeObject it to a single .pkg from which you load them in one >>> go. >>> >>> Could it be that the type declared in one .drl is used in another .drl >>> in the same package? Reading this in the wrong order might cause the >>> CNF. >>> >>> -W >>> >>> On 24/10/2012, Willem van Asperen <wil...@van.asperen.org> wrote: >>>> Dear All, >>>> >>>> I use the Drools compiler to compile a set of drl files: >>>> >>>> >>>> KnowledgeBuilder kbuilder = >>>> KnowledgeBuilderFactory.newKnowledgeBuilder(configuration); >>>> kbuilder.add(ResourceFactory.newFileResource(fileName), >>>> ResourceType.DRL); >>>> >>>> KnowledgeBuilderErrors errors = kbuilder.getErrors(); >>>> if (errors.size() > 0) { >>>> for (KnowledgeBuilderError error: errors) { >>>> logger.error(error); >>>> } >>>> throw new IllegalArgumentException("Could not parse >>>> knowledge."); >>>> } >>>> >>>> ObjectOutputStream out = new ObjectOutputStream(new >>>> FileOutputStream(fileName+".compiled")); >>>> out.writeObject( kbuilder.getKnowledgePackages()); >>>> out.close(); >>>> >>>> I then load these *.compiled files into my application: >>>> >>>> >>>> for (String packageName : packages) { >>>> InputStream is = >>>> getClass().getResourceAsStream("/"+packageName+".drl.compiled"); >>>> if (is != null) { >>>> logger.debug("adding package '"+packageName+"'"); >>>> ObjectInputStream in = new ObjectInputStream(is); >>>> kbase.addKnowledgePackages((Collection<KnowledgePackage>) >>>> in.readObject()); >>>> in.close(); >>>> } else >>>> throw new FileNotFoundException("could not find >>>> resource for package "+packageName); >>>> is.close(); >>>> } >>>> >>>> In some of these drl files I declare a class, for instance: >>>> >>>> package vcm.selection.standard; >>>> >>>> import com.paconsulting.pase.transport.agents.ShiftWorker; >>>> import com.paconsulting.pase.transport.agents.VCMShiftWorker; >>>> import com.paconsulting.pase.transport.actions.ExecutableAction; >>>> import com.paconsulting.pase.transport.agents.ScheduleManagingContainer; >>>> import com.paconsulting.pase.transport.agents.water.Bridge; >>>> import com.paconsulting.pase.transport.agents.movers.AbstractMover; >>>> import com.paconsulting.pase.transport.agents.movers.Ship; >>>> import com.paconsulting.pase.transport.agents.movers.VCMShip; >>>> >>>> declare RelevantExecutableAction >>>> agent : ShiftWorker >>>> executableAction : ExecutableAction >>>> end >>>> ... >>>> >>>> When running the >>>> kbase.addKnowledgePackages((Collection<KnowledgePackage>) >>>> in.readObject()) I get the following ClassNotFound stack trace: >>>> >>>> java.lang.ClassNotFoundException: >>>> vcm.selection.standard.RelevantExecutableAction >>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:366) >>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:355) >>>> at java.security.AccessController.doPrivileged(Native Method) >>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:354) >>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:423) >>>> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) >>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:356) >>>> at java.lang.Class.forName0(Native Method) >>>> at java.lang.Class.forName(Class.java:264) >>>> 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:1593) >>>> at >>>> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) >>>> at >>>> java.io.ObjectInputStream.readClass(ObjectInputStream.java:1480) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1330) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at >>>> org.drools.rule.ConsequenceMetaData$Statement.readExternal(ConsequenceMetaData.java:61) >>>> at >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at java.util.ArrayList.readObject(ArrayList.java:733) >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>> at >>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >>>> at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>>> at java.lang.reflect.Method.invoke(Method.java:601) >>>> at >>>> java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) >>>> at >>>> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at >>>> org.drools.rule.ConsequenceMetaData.readExternal(ConsequenceMetaData.java:19) >>>> at >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at org.drools.rule.Rule.readExternal(Rule.java:207) >>>> at >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at >>>> org.drools.rule.JavaDialectRuntimeData.readExternal(JavaDialectRuntimeData.java:195) >>>> at >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at java.util.HashMap.readObject(HashMap.java:1155) >>>> at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) >>>> at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>>> at java.lang.reflect.Method.invoke(Method.java:601) >>>> at >>>> java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) >>>> at >>>> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at >>>> org.drools.rule.DialectRuntimeRegistry.readExternal(DialectRuntimeRegistry.java:58) >>>> at >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at org.drools.rule.Package.readExternal(Package.java:208) >>>> at >>>> org.drools.definitions.impl.KnowledgePackageImp.readExternal(KnowledgePackageImp.java:157) >>>> at >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at java.util.ArrayList.readObject(ArrayList.java:733) >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>> at >>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >>>> at >>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>>> at java.lang.reflect.Method.invoke(Method.java:601) >>>> at >>>> java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) >>>> at >>>> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) >>>> at >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) >>>> at >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) >>>> at >>>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.definition.KnowledgebaseDefinition.addPackages(KnowledgebaseDefinition.java:48) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.definition.KnowledgebaseDefinition.materialize(KnowledgebaseDefinition.java:59) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.definition.TeamDefinition.materialize(TeamDefinition.java:97) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.definition.OperatingModelDefinition.materialize(OperatingModelDefinition.java:36) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.Run.<init>(Run.java:31) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.definition.RunDefinition.materialize(RunDefinition.java:53) >>>> at >>>> com.paconsulting.pase.core.configuration.runconfig.RunConfigExecutor$ScheduleExecutorWrapper.run(RunConfigExecutor.java:69) >>>> ... >>>> >>>> I'm sure I miss something as this is basic functionality. Maybe I must >>>> tell the kbase where to load the classes... >>>> >>>> Can someone point me in the right direction? >>>> >>>> Thanks, >>>> Willem >>>> >>>> _______________________________________________ >>>> rules-users mailing list >>>> rules-us...@lists.jboss.org >>>> https://lists.jboss.org/mailman/listinfo/rules-users >>>> >>> _______________________________________________ >>> rules-users mailing list >>> rules-us...@lists.jboss.org >>> https://lists.jboss.org/mailman/listinfo/rules-users >> _______________________________________________ rules-dev mailing list rules-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-dev