Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-419

"Cannot find KieModule" with kieServices.newKieContainer() with LATEST or RELEASE instead of explicit version number (eg: 0.0.1) on a application where the KIE module Rule artifact project kjar has been locally-installed from remote Maven repository.

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Minor
    • None
    • 6.0.1.Final
    • None
    • None
    • Compatibility/Configuration

    Description

      Hello, this is to report (potentially) a bug about "Cannot find KieModule: com.acme:X:RELEASE" or "Cannot find KieModule: com.acme:X:LATEST" when invoking kieServices.newKieContainer( releaseId ) with LATEST or RELEASE instead of explicit version number (eg: 0.0.1) on a application where the KIE module Rule artifact project kjar has been locally-installed from remote Maven repository.

      More precisely, with reference to http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/#d0e933 , I mean that before launching Application, I performed

      mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -Dartifact=com.acme:drools6testmvnlatest.therules:LATEST -DrepoUrl=http://nexus-hostname/nexus/content/repositories/releases/
      
      Disclaimer

      I'm not 100% sure whether this is bug of maven process, maven libraries, or Drools library; I prefer to report it anyway because likely could impact other users if installing via the maven-dependency-plugin:get goal, especially in distributed or JavaEE deployments? Sorry if actually not Drools library bug, I report all details below, including current workaround I have found to avoid this issue.

      DETAILS

      Suppose there is a kjar artifact KIE module, 'drools6testmvnlatest.therules', as per attached project zip file. And this artifact is installed in local nexus repository at http://nexus-hostname/nexus/content/repositories/releases/ .

      Now ,suppose with reference to http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/#d0e933 , Application is jar 'drools6testmvnlatest.thestandaloneengine' as per attached project zip file, and is being executed on a dedicate machine, not the development computers.

      App.java
      public static void main( String[] args ) {
      	KieServices kieServices = KieServices.Factory.get();
      	ReleaseId releaseId = kieServices.newReleaseId( "com.acme", "drools6testmvnlatest.therules", args[0] );
      	KieContainer kContainer = kieServices.newKieContainer( releaseId );
      	KieBaseConfiguration kieBaseConf = kieServices.newKieBaseConfiguration();
      	kieBaseConf.setOption( EventProcessingOption.STREAM );
      	KieBase kBase = kContainer.newKieBase(kieBaseConf);
      	for ( KiePackage a : kBase.getKiePackages()) {
      			for (Rule r : a.getRules()) {
      				logger.info("KiePackage {} Rule {}", new Object[]{a.getName(), r.getName()});
      			}
      	}
      }
      

      The first thing to do before executing it, would be to fetch and install into local .m2 repository the required KIE module Rule artifact project kjar 'drools6testmvnlatest.therules'. To do so, the following command is executed:

      mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -Dartifact=com.acme:drools6testmvnlatest.therules:LATEST -DrepoUrl=http://nexus-hostname/nexus/content/repositories/releases/
      

      Execution of

      java -jar drools6testmvnlatest.thestandaloneengine-jar-with-dependencies.jar RELEASE
      

      Would generate the following stack trace

      Exception in thread "main" java.lang.RuntimeException: Cannot find KieModule: com.acme:drools6testmvnlatest.therules:RELEASE
              at org.drools.compiler.kie.builder.impl.KieServicesImpl.newKieContainer(KieServicesImpl.java:86)
              at com.acme.drools6testmvnlatest.thestandaloneengine.App.main(App.java:24)
      

      Same for LATEST as launch parameter.

      But fixed version, eg: 0.0.2 as launch parameter, will work.

      D:\inbox>java -jar drools6testmvnlatest.thestandaloneengine-jar-with-dependencies.jar 0.0.2
      2014-01-30 19:24:12,128 [main] INFO  org.drools.compiler.kie.builder.impl.KieRepositoryImpl - KieModule was added:ZipKieModule[ ReleaseId=com.acme:drools6testmvnlatest.therules:0.0.2file=D:\Documents and Settings\mmortari\.m2\repository\com\acme\drools6testmvnlatest.therules\0.0.2\drools6testmvnlatest.therules-0.0.2.jar]
      2014-01-30 19:24:12,440 [main] INFO  com.acme.drools6testmvnlatest.thestandaloneengine.App - KiePackage com.acme.drools6testmvnlatest.therules Rule Dummy rule on String
      

      Please notice at this point this is the content of the .m2 local repository (this led me to discover the workaround)

      D:\DOCUMENTS AND SETTINGS\MMORTARI\.M2\REPOSITORY\COM\ACME
      └───drools6testmvnlatest.therules
          │   maven-metadata-nexus-hostname-nexus.xml
          │   maven-metadata-nexus-hostname-nexus.xml.sha1
          │   maven-metadata-temp.xml
          │   maven-metadata-temp.xml.sha1
          │   resolver-status.properties
          │
          └───0.0.2
                  drools6testmvnlatest.therules-0.0.2.jar
                  drools6testmvnlatest.therules-0.0.2.jar.sha1
                  drools6testmvnlatest.therules-0.0.2.pom
                  drools6testmvnlatest.therules-0.0.2.pom.sha1
                  _remote.repositories
      
      WORKAROUND

      The only options 1-2-3 ways I found to avoid this issue, and be able to launch successfully with RELEASE or LATEST as the launch parameter for the ReleaseId version, is to:

      Workaround Option 1

      Do 'fake' a pom.xml with the dependency, something similar to:

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
      
        <groupId>com.acme</groupId>
        <artifactId>fakepom</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
      
        <dependencies>
          <dependency>
            <groupId>com.acme</groupId>
            <artifactId>drools6testmvnlatest.therules</artifactId>
            <version>RELEASE</version>
          </dependency>
        </dependencies>
        
      </project>
      

      And then launch maven in the same directory of this 'fake' pom.xml with the following command:

      mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:go-offline 
      

      This usually generate the 'maven-metadata-local' file in the local .m2 repo:

      D:\DOCUMENTS AND SETTINGS\MMORTARI\.M2\REPOSITORY\COM\ACME
      └───drools6testmvnlatest.therules
          │   maven-metadata-nexus-hostname-nexus.xml
          │   maven-metadata-nexus-hostname-nexus.xml.sha1
          │   maven-metadata-local.xml
          │   maven-metadata-local.xml.sha1
          │   maven-metadata-temp.xml
          │   maven-metadata-temp.xml.sha1
          │   resolver-status.properties
          │
          └───0.0.2
                  drools6testmvnlatest.therules-0.0.2.jar
                  drools6testmvnlatest.therules-0.0.2.jar.sha1
                  drools6testmvnlatest.therules-0.0.2.pom
                  drools6testmvnlatest.therules-0.0.2.pom.sha1
                  _remote.repositories
      
      Workaround Option2

      Well, actually this is to report that not all the time the Option1 works, so what I do, is that I copy-rename the 'maven-metadata-temp.xml' file into the 'maven-metadata-local.xml' file.

      Workaround Option3

      Download manually the .jar file, the .pom file from the nexus webapplication, then usual maven

      D:\inbox>mvn install:install-file -Dfile=drools6testmvnlatest.therules-0.0.2.jar -DpomFile=drools6testmvnlatest.therules-0.0.2.pom -Dpackaging=jar
      

      This will create directly the 'maven-metadata-local.xml' file and the ' -Dpackaging=jar' option do force it to install it in the .m2 local repository with .jar extension (not kjar)

      D:\DOCUMENTS AND SETTINGS\MMORTARI\.M2\REPOSITORY\COM\ACME
      └───drools6testmvnlatest.therules
          │   maven-metadata-local.xml
          │
          └───0.0.2
                  drools6testmvnlatest.therules-0.0.2.jar
                  drools6testmvnlatest.therules-0.0.2.pom
                  _remote.repositories
      

      Attachments

        Activity

          People

            mfusco@redhat.com Mario Fusco
            mmortari@redhat.com Matteo Mortari
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: