java.lang.ClassFormatException in DRL6Lexer

1,248 views
Skip to first unread message

sascha.s...@signavio.com

unread,
Mar 10, 2015, 1:27:24 PM3/10/15
to drools...@googlegroups.com
Hi *,

I am currently working on exporting our custom format into DRL.

This is working fine so far.

To test this, I have a couple of test cases that convert our format into DRL and then execute it with some input values.
Unfortunately, I am getting the following exceptions:

java.lang.ClassFormatError: Invalid method Code length 100690 in class file org/drools/compiler/lang/DRL6Lexer
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:792)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
java.net.URLClassLoader.access$100(URLClassLoader.java:71)
java.net.URLClassLoader$1.run(URLClassLoader.java:361)
java.net.URLClassLoader$1.run(URLClassLoader.java:355)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:354)
java.lang.ClassLoader.loadClass(ClassLoader.java:424)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
java.lang.ClassLoader.loadClass(ClassLoader.java:357)
org.drools.compiler.compiler.DRLFactory.getDRLLexer(DRLFactory.java:97)
org.drools.compiler.compiler.DRLFactory.buildLexer(DRLFactory.java:44)
org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:153)
org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:144)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.drlToPackageDescr(KnowledgeBuilderImpl.java:445)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addPackageFromDrl(KnowledgeBuilderImpl.java:433)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addKnowledgeResource(KnowledgeBuilderImpl.java:653)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2164)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2153)
com.signavio.droolsexport.integration.DiagramToDRLEndToEndTest.thatEnumsAreHandledCorrectly(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
org.testng.TestRunner.privateRun(TestRunner.java:767)
org.testng.TestRunner.run(TestRunner.java:617)
org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
org.testng.SuiteRunner.run(SuiteRunner.java:240)
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
org.testng.TestNG.run(TestNG.java:1031)
com.signavio.testing.framework.AbstractRunTestNG.run(AbstractRunTestNG.java:117)
com.signavio.testing.framework.RunTestNGSuites.run(RunTestNGSuites.java:83)
com.signavio.testing.framework.RunTestNGSuites.main(RunTestNGSuites.java:72)


Here is the code that I am running:

@Test(dataProvider = ENUM_TABLE_INPUTS)
    public void thatEnumsAreHandledCorrectly(Status status, String expected) throws Exception {
        String enumJson = FileUtil.readWholeFile(getClass(),RELATIVE_INPUT_FILE_PATH + "enums.json");
        LinkedDecisionTableParser parser = new LinkedDecisionTableParser();
JSONArray dmnModels = new JSONArray();
dmnModels.put(JSONUtil.getJsonObjectFromString(enumJson));
List<DecisionTable> decisionTables = parser.parseThrowing(dmnModels);
String drlOutput = DroolsExporter.exportToDrools(decisionTables);
        File outputFile = FileUtil.createTempFileAtGivenRelativePath(getClass(), RELATIVE_OUTPUT_FILE_PATH, "drl");
        FileUtil.writeToFile(outputFile, drlOutput);
        KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        knowledgeBuilder.add(ResourceFactory.newFileResource(outputFile), ResourceType.DRL);
        KieBase knowledgeBase = knowledgeBuilder.newKnowledgeBase();
        KieSession session = knowledgeBase.newKieSession();
        FactType enums = knowledgeBase.getFactType("com.signavio.droolsexport", "Enums");
        Object enumObject = enums.newInstance();
        enums.set(enumObject, "status", status);
        session.insert(enumObject);
        session.fireAllRules();
        String result = (String) enums.get(enumObject, "display");
        assertEquals(result, expected);
        session.dispose();
        session.destroy();
        outputFile.delete();
        assertFalse(outputFile.exists());
    }


I used the following inputs:
Status.VIP, "Important Person",
Status.IP, "Important Person",
Status.NIP, "Not an important Person"

The generated DRL looks as follows:

package com.signavio.droolsexport 

declare  Enums 

    status : Status  
    display : String  
end


declare enum Status

VIP,NIP,IP;

end


rule "enums_Rule_1"
    no-loop 
when
    $enums : Enums( status == Status.VIP || status == Status.IP )  
then
    modify( $enums ){ 
        setDisplay("Important Person") 
    };
end

rule "enums_Rule_2"
    no-loop 
when
    $enums : Enums( status != Status.VIP && status != Status.IP )  
then
    modify( $enums ){ 
        setDisplay("Not an Important Person") 
    };
end

The test cases actually work fine when triggering them from the IDE, but when using an ANT target (as our CI would), they fail with the above mentioned exception,

Additionally on the same test with inputs Status.NIP and "Not an important Person" I am getting this slightly different exception:

java.lang.ClassFormatError: org/drools/compiler/lang/DRL6Lexer
org.drools.compiler.compiler.DRLFactory.getDRLLexer(DRLFactory.java:97)
org.drools.compiler.compiler.DRLFactory.buildLexer(DRLFactory.java:44)
org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:153)
org.drools.compiler.compiler.DrlParser.parse(DrlParser.java:144)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.drlToPackageDescr(KnowledgeBuilderImpl.java:445)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addPackageFromDrl(KnowledgeBuilderImpl.java:433)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addKnowledgeResource(KnowledgeBuilderImpl.java:653)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2164)
org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:2153)
com.signavio.droolsexport.integration.DiagramToDRLEndToEndTest.thatEnumsAreHandledCorrectly(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
org.testng.TestRunner.privateRun(TestRunner.java:767)
org.testng.TestRunner.run(TestRunner.java:617)
org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
org.testng.SuiteRunner.run(SuiteRunner.java:240)
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
org.testng.TestNG.run(TestNG.java:1031)
com.signavio.testing.framework.AbstractRunTestNG.run(AbstractRunTestNG.java:117)
com.signavio.testing.framework.RunTestNGSuites.run(RunTestNGSuites.java:83)
com.signavio.testing.framework.RunTestNGSuites.main(RunTestNGSuites.java:72)

I am grateful for any help on resolving this!

Tried with drools 6.2.0 CR4 as well as 6.2.0 Final.

Thanks!

- Sascha


Edson Tirelli

unread,
Mar 10, 2015, 8:52:07 PM3/10/15
to drools...@googlegroups.com
This looks like a classpath or jvm version error. The offending
class (DRL6Lexer) is generated by antlr, so start double checking your
antlr dependency versions. Failing that try to check your jvm version
and what's different between your IDE and your ant project.

Edson
> --
> You received this message because you are subscribed to the Google Groups
> "Drools Usage" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to drools-usage...@googlegroups.com.
> To post to this group, send email to drools...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/drools-usage/06190f1e-7e83-4723-86f2-68b8c9fc0656%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



--
Edson Tirelli
Principal Software Engineer
Red Hat Business Systems and Intelligence Group

sascha.s...@signavio.com

unread,
Mar 24, 2015, 6:19:28 AM3/24/15
to drools...@googlegroups.com
I am honestly a bit lost here.

Also I realized the IDE throws the same exceptions, but TestNG does not treat them as errors that make the tests fail.
I am using the following libs:

antlr-runtime 3.5.2
Drools everything 6.2.0 Final (drools-compiler, drools-core, kie-api, kie-internal)
mvel2 2.2.4

I just tried adding junit 4.12 and org.antlr stringtemplate 4.0.2 (it was stated as a dependency in the POM of antlr).

Am i simply missing any dependencies?
Reply all
Reply to author
Forward
0 new messages