Search code examples
drools

Drools program throwing java.lang.NoClassDefFoundError:org/drools/core/impl/KnowledgeBaseFactoryServiceImpl


Need some help in running a simple POC from eclipse. I have written a java class and a rule (.drl) in eclipse (using drools distribution 7.6.0).Code snippet where i'm creating a knowledgebase to run the rules:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("rules/Sample Rule.drl"), ResourceType.DRL);

    KnowledgeBuilderErrors errors = kbuilder.getErrors();

    if (errors.size() > 0) {
        for (KnowledgeBuilderError error : errors) {
            System.err.println(error);
        }
        throw new IllegalArgumentException("Could not parse knowledge.");
    }

    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

The code does not have any error. But on run time, i see the below exception

Caused by: java.lang.ClassNotFoundException: org.drools.core.impl.KnowledgeBaseFactoryServiceImpl
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 14 more

I have imported Knowledge-api-6.5.0.Final.jar. But do not see

org.drools.core.impl.KnowledgeBaseFactoryServiceImpl

instead i see

org.drools.impl.KnowledgeBaseFactoryServiceImpl

inside the jar. Am i missing something?


Solution

  • If you are using Drools 7.6.0, why did you import Knowledge-api-6.5.0.Final.jar?

    Even if you import the right version of that jar, it will only contain the API interfaces, but no implementation at all. You still need to provide the classes implementing those interfaces while executing your code.

    If you are using Maven, these are the dependencies you will need:

    <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-api</artifactId>
        <version>${drools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>${drools.version}</version>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>${drools.version}</version>
    </dependency>
    

    For version 7.7.0-SNAPSHOT, these dependencies translate to the following jar files:

    • kie-api-7.7.0-SNAPSHOT.jar
    • drools-compiler-7.7.0-SNAPSHOT.jar
    • drools-core-7.7.0-SNAPSHOT.jar

    The problem of not using a dependency management system (like Maven) is that you may still need to add some extra jars to your classpath.

    Hope it helps,