Java 如何在桌面应用程序中设置jBPM? 我想要的是:

Java 如何在桌面应用程序中设置jBPM? 我想要的是:,java,persistence,desktop-application,jbpm,Java,Persistence,Desktop Application,Jbpm,我正在创建一个原型,它应该读取bpmn2文件并列出它的所有任务 我使用的是: 目前,我有一个使用jBPM 6的简单Maven应用程序。我不需要任何应用服务器、工作台等,因为它只是一个简单的桌面应用程序 问题是: 如果我像这样初始化引擎(): 我得到这个错误: Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named org.j

我正在创建一个原型,它应该读取bpmn2文件并列出它的所有任务

我使用的是: 目前,我有一个使用jBPM 6的简单Maven应用程序。我不需要任何应用服务器、工作台等,因为它只是一个简单的桌面应用程序

问题是: 如果我像这样初始化引擎():

我得到这个错误:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named org.jbpm.persistence.jpa
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
    at org.jbpm.runtime.manager.impl.DefaultRuntimeEnvironment.init(DefaultRuntimeEnvironment.java:72)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:314)
    at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:56)
    at com.test.jbpmpoc.main(App.java:11)
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: org.jbpm.persistence.jpa] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
    at com.test.jbpmpoc.App.main(App.java:30)
Caused by: org.hibernate.HibernateException: Errors in named queries: GetProcessInstanceIdByCorrelation
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:435)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891)
    ... 4 more
请注意,我试图在显式禁用持久性的情况下启动引擎,但我认为这是不必要的,因为文档中说明了这一点

据我所知: 根据我的研究,至少有两种初始化引擎的方法

  • 使用一个提供运行时环境的构建器——我已经在这么做了。这似乎是因为默认情况下所有服务都会初始化。但是,正如前面所说的,如果您想使用任务(这是我所做的),这个方法需要设置持久性

  • 手动初始化所有内容。我不太喜欢这个,因为运行一个简单的应用程序听起来太费劲了

  • 使用其他运行时环境生成器

  • 我所尝试的: 起初,我尝试使用,但在创建
    EntityManagerFactory
    时出现了不同的错误:

    Exception in thread "main" javax.persistence.PersistenceException: Unable to build entity manager factory
        at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:83)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
        at com.test.jbpmpoc.App.main(App.java:30)
    Caused by: org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [jdbc/jbpm-ds]
        at org.hibernate.engine.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:141)
        at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:112)
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
        at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
        at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
        ... 3 more
    Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
        at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
        at javax.naming.InitialContext.getNameParser(Unknown Source)
        at org.hibernate.engine.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:135)
        ... 20 more
    
    我没有使用应用服务器,也没有JTA数据源和ORM文件,因此我对指向这些文件的行进行了注释,以修复此JNDI错误,然后我得到了另一个异常:

    Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.NamedQuery.lockMode()Ljavax/persistence/LockModeType;
        at org.hibernate.cfg.annotations.QueryHintDefinition.determineLockOptions(QueryHintDefinition.java:138)
        at org.hibernate.cfg.annotations.QueryBinder.bindQuery(QueryBinder.java:72)
        at org.hibernate.cfg.annotations.QueryBinder.bindQueries(QueryBinder.java:219)
        at org.hibernate.cfg.AnnotationBinder.bindQueries(AnnotationBinder.java:374)
        at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:618)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
        at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
        at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
        at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
        at com.test.jbpmpoc.App.main(App.java:30)
    
    我很确定我离这里越来越近了。如果我在应用服务器之外运行,我真的需要JTA数据源和ORM文件吗?jBPM安装程序没有这些,我在哪里可以找到它们

    我还尝试使用一个空的构建器而不是一个默认的构建器,因此我需要手动初始化所有内容,包括TaskService,如果我想管理任务(列表、执行等),我认为需要启动TaskService。但是,它也需要persistence.xml,因为我一直收到
    No persistence provider
    消息

    编辑 我早就应该猜到,
    NoSuchMethodError
    异常是由错误版本中的Maven工件引起的。在持久性定义中,我还将JTA作为事务策略,但没有提供任何JTA数据源。但是,现在我已经更改了pom.xml和persistence.xml,我遇到了以下错误:

    Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named org.jbpm.persistence.jpa
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
        at org.jbpm.runtime.manager.impl.DefaultRuntimeEnvironment.init(DefaultRuntimeEnvironment.java:72)
        at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:314)
        at org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder.get(RuntimeEnvironmentBuilder.java:56)
        at com.test.jbpmpoc.main(App.java:11)
    
    Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: org.jbpm.persistence.jpa] Unable to build EntityManagerFactory
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900)
        at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
        at com.test.jbpmpoc.App.main(App.java:30)
    Caused by: org.hibernate.HibernateException: Errors in named queries: GetProcessInstanceIdByCorrelation
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:435)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
        at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891)
        ... 4 more
    
    线程“main”javax.persistence.PersistenceException中的异常:[PersistenceUnit:org.jbpm.persistence.jpa]无法构建EntityManagerFactory 位于org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) 位于org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57) 位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:63) 位于javax.persistence.persistence.createEntityManagerFactory(persistence.java:47) 位于com.test.jbpmpoc.App.main(App.java:30) 原因:org.hibernate.HibernateException:命名查询中的错误:GetProcessInstanceIdByCorrelation 位于org.hibernate.impl.SessionFactoryImpl。(SessionFactoryImpl.java:435) 位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385) 位于org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) 位于org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891) ... 4更多 看来
    JBPMorm.xml
    文件中的一个命名查询是错误的。我从中复制了这个文件

    有关我的Java项目的更多信息:

    我发现的所有示例和教程都集中在创建在应用服务器上运行的web应用程序上,但在我的例子中,缺少应用服务器需要一个解决方案,我还没有找到有人使用jBPM 6运行过简单的桌面应用程序吗?

    我可能没有直接回答您的问题,但我觉得下面的答案可以引导您找到解决方案

    我从这个问题得出的结论是,基本上这里我们希望以编程方式(不需要数据库等外部依赖项)创建jBPM运行时并对其进行操作

    我建议您阅读用户指南-第6.8节。测试,这有助于您测试流程,您可以测试流程在特定用例中是否按预期运行

    文档建议您扩展JbpmJUnitBaseTestCase并创建junit测试用例。JbpmJUnitBaseTestCase类将逻辑抽象为createRuntimeManager、assertProcessInstanceCompleted等。。。您可以引用或重用此类来构建应用程序


    请参见

    谢谢您的回复。实际上我以前也试过,但是我仍然得到了
    java.lang.NoSuchMethodError:javax.persistence.NamedQuery.lockMode()Ljavax/persistence/LockModeTypecreateRuntimeManager(“poc4.bpmn2”)时出现代码>异常。为了摆脱它,我可以在禁用持久性的情况下调用超类构造函数,但是这样我就不能使用任务服务了。