Using "assets" property of "RuntimeEnvironmentFactoryBean" Spring bean to load BPMN2 process definitions from kjar causes "java.io.FileNotFoundException"

Solution Verified - Updated -

Issue

  • There are scenarios where users would like to use the obtain and load kjars (containing BPMN2 process definitions) downloaded to the local maven repository inside the <USER_HOME>/.m2/repository location of the filesystem within their Spring based applications. In such a scenario there seems to be a problem with configuring and using org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean bean to define the G.A.V. details of the intended kjars. The problem arises when users attempt to choose specific assets (e.g. BPMN2 process definitions) from kjars using assets property through org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean bean configuration inside ApplicationContext.xml file as shown below.
...
    <bean id="processA" factory-method="newClassPathResource" class="org.kie.internal.io.ResourceFactory">  
        <constructor-arg>    
            <value>com/aaa/bbb/ccc/package/SimpleProcess.bpmn2</value>  
        </constructor-arg>
    </bean>

    <bean id="defaultRuntimeEnvironment" class="org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean" >
...
        <property name="kbaseName" value="firstKBase"/>
        <property name="assets">   
            <map>      
                <entry key-ref="processA"><util:constant static-field="org.kie.api.io.ResourceType.BPMN2"/>
                </entry>                
            </map>  
         </property> 
        <property name="groupId" value= "com.simple.jbpm.process"/>
        <property name="artifactId" value= "SimpleProcessProject"/>  
        <property name="version" value= "1.0-SNAPSHOT"/> 
    </bean>

...

During the deployment of the application it throws the following exception.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultRuntimeManager' defined in class path resource [ApplicationContext.xml]: Cannot resolve reference to bean 'defaultRuntimeEnvironment' while setting bean property 'defaultRuntimeEnvironment'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultRuntimeEnvironment': FactoryBean threw exception on object creation; nested exception is java.lang.RuntimeException: Unable to get LastModified for ClasspathResource
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1327)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1085)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:516)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.sample.RuntimeManagerTest.testBean(RuntimeManagerTest.java:26)
    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:606)
    at junit.framework.TestCase.runTest(TestCase.java:176)
    at junit.framework.TestCase.runBare(TestCase.java:141)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:255)
    at junit.framework.TestSuite.run(TestSuite.java:250)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultRuntimeEnvironment': FactoryBean threw exception on object creation; nested exception is java.lang.RuntimeException: Unable to get LastModified for ClasspathResource
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1440)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:247)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    ... 34 more
Caused by: java.lang.RuntimeException: Unable to get LastModified for ClasspathResource
    at org.drools.core.io.impl.ClassPathResource.getLastModified(ClassPathResource.java:211)
    at org.drools.core.io.impl.ClassPathResource.getInputStream(ClassPathResource.java:148)
    at org.drools.core.io.impl.ClassPathResource.getReader(ClassPathResource.java:233)
    at org.jbpm.compiler.ProcessBuilderImpl.addProcessFromXml(ProcessBuilderImpl.java:264)
    at org.drools.compiler.compiler.PackageBuilder.addProcessFromXml(PackageBuilder.java:700)
    at org.drools.compiler.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:741)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:51)
    at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:40)
    at org.jbpm.runtime.manager.impl.SimpleRuntimeEnvironment.addAsset(SimpleRuntimeEnvironment.java:104)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.addAsset(RuntimeEnvironmentBuilder.java:281)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.addAsset(RuntimeEnvironmentBuilder.java:56)
    at org.kie.spring.factorybeans.RuntimeEnvironmentFactoryBean.getObject(RuntimeEnvironmentFactoryBean.java:179)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 39 more
Caused by: java.io.FileNotFoundException: 'com/aaa/bbb/ccc/package/SimpleProcess.bpmn2' cannot be opened because it does not exist
    at org.drools.core.io.impl.ClassPathResource.getURL(ClassPathResource.java:172)
    at org.drools.core.io.impl.ClassPathResource.getLastModified(ClassPathResource.java:184)
    ... 51 more

  • What is the root cause of this issue and how to workaround it?

Environment

  • Red Hat JBoss BPM Suite (BPMS)
    • 6.0.3

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content