Jakarta ee 开放EJB嵌入式容器的命名约定?

Jakarta ee 开放EJB嵌入式容器的命名约定?,jakarta-ee,ejb,apache-tomee,openejb,Jakarta Ee,Ejb,Apache Tomee,Openejb,我正在使用openejbembedded容器为javaee应用程序编写测试。该应用程序只包含一个无状态bean和测试 import javax.ejb.embeddable.EJBContainer; import org.junit.Before; import org.junit.Test; public class ProductDaoTest { private EJBContainer container; @Before public void ini

我正在使用
openejb
embedded容器为javaee应用程序编写测试。该应用程序只包含一个无状态bean和测试

import javax.ejb.embeddable.EJBContainer;

import org.junit.Before;
import org.junit.Test;

public class ProductDaoTest {

    private EJBContainer container;

    @Before
    public void initializeContainerAndDatabase(){
        container = EJBContainer.createEJBContainer();
        System.out.println(container);
    }

    @Test
    public void test(){

    }
}
出于某些原因,嵌入式容器启动的成败取决于源代码所在的文件夹名。我试过不同的名字,有些有效,有些无效,我觉得这种模式是随机的

hibernate javaee-->无法工作
hibernate ejb-->无法工作
javaee hibernate-->无法工作
abc xyz-->已工作
休眠abc xyz def-->无法工作
abc xyz def ejb-->无法工作
abc xyz def javaee-->已工作
abc xyz def休眠-->已工作

发生故障时,异常跟踪为:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.ares.hibernate.javaee.dao.ProductDaoTest
INFO - ********************************************************************************
INFO - OpenEJB http://tomee.apache.org/
INFO - Startup: Wed Jun 08 08:57:56 IST 2016
INFO - Copyright 1999-2015 (C) Apache OpenEJB/TomEE Project, All Rights Reserved.
INFO - Version: 4.7.4
INFO - Build date: 20160304
INFO - Build time: 09:05
INFO - ********************************************************************************
INFO - openejb.home = C:\fakepath\hibernate-abc-xyz-def
INFO - openejb.base = C:\fakepath\hibernate-abc-xyz-def
INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@26f67b76
INFO - Succeeded in installing singleton service
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
INFO - Cannot find the configuration file [conf/openejb.xml].  Will attempt to create one for the beans deployed.
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Creating TransactionManager(id=Default Transaction Manager)
INFO - Creating SecurityService(id=Default Security Service)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.039 sec <<< FAILURE!
test(org.ares.hibernate.javaee.dao.ProductDaoTest)  Time elapsed: 1.81 sec  <<< ERROR!
org.apache.openejb.OpenEjbContainer$NoModulesFoundException: No modules found to deploy.
1)Maybe descriptors are placed in incorrect location.
Descriptors could go under:
<base-dir>/META-INF or <base-dir>/WEB-INF
but not directly under <base-dir>
Check 'Application Discovery via the Classpath' docs page for more info
2)Maybe no modules are present in the classpath.
Is 'openejb.base' system property pointing to the intended location?
        at org.apache.openejb.util.Exceptions.newNoModulesFoundException(Exceptions.java:99)
        at org.apache.openejb.OpenEjbContainer$Provider.load(OpenEjbContainer.java:540)
        at org.apache.openejb.OpenEjbContainer$Provider.createEJBContainer(OpenEjbContainer.java:322)
        at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:56)
        at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:43)
        at org.ares.hibernate.javaee.dao.ProductDaoTest.initializeContainerAndDatabase(ProductDaoTest.java:14)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)


Results :

Tests in error:
  test(org.ares.hibernate.javaee.dao.ProductDaoTest): No modules found to deploy.(..)
为了确保会话bean在我添加的类路径中被发现

Enumeration<URL> ejbJars = this.getClass().getClassLoader().getResources("org/ares/hibernate/javaee/dao/ProductDao.class");
        while (ejbJars.hasMoreElements()) {
            URL url = ejbJars.nextElement();
            System.out.println("app = " + url);
        }
是否有一个我不知道的命名约定,或者我偶然发现了一个bug


应用程序的源代码是。项目的父目录为
abc def
,在运行
mvn clean test
时,项目运行。如果父目录名更改为
hibernatejavaee
,并且应用程序停止工作

关于命名约定问题,没有。我很确定您在某个地方(系统属性文件或编程方式)排除/包括路径。排除/包括允许使用通配符,这就是为什么有些文件夹模式有效,有些则无效。要不排除任何内容并包含所有内容,请使用以下属性创建EJB容器

Properties p = new Properties();
p.put("openejb.deployments.classpath.exclude", "");
p.put("openejb.deployments.classpath.include", ".*");
container = EJBContainer.createEJBContainer(p);
有关更多说明,请参阅

确保部署
EJB
的其他选项

选项1:应用程序发现

如果不想添加其他配置文件,则必须确保EJB文件夹是类路径的一部分,并且EJB包含
EJB jar.xml
。有关更多说明,请参阅

选项2:配置文件

根据日志,您没有配置配置文件

INFO - Cannot find the configuration file [conf/openejb.xml].  Will attempt to create one for the beans deployed.

在大多数情况下,这很好,自定义配置文件是例外。尝试使用文件夹设置设置配置文件。有关更多说明,请参阅

一些会自动从OpenEJB扫描中排除。

请注意,OpenEJB.additional.include=myjarprefix可以让您将其添加回扫描中。它将删除冲突的排除项,因此,如果您使用它,则尽可能使其更长。它可以在conf/system.properties中设置。

对于答案的第二部分,根据,
OpenEJB将在没有任何配置的情况下正常工作,并将根据需要愉快地创建内容,并为所有内容选择默认值。因此,真正意义上的配置就是覆盖这些默认值。
我不会覆盖工作和非工作场景的任何默认值。我将检查您在回答的第一部分中提供的链接。检查应用程序发现的链接,没有与通配符相关的内容。它正在处理目录名的一些更改,这让我发疯。@ares,请发布您的系统属性文件。您可以在conf/system.properties中找到该文件。并检查${user.home}/.openejb/system.properties中是否存在其他user system.properties文件。我正在使用一个具有依赖项
org.apache.openejb tomee embedded 1.7.4
的嵌入式容器。因此我没有
conf/system.properties
。另外,我没有
${user.home}/.openejb/system.properties
好的,您的测试类在类路径中,它包含一个ejb jar.xml?实际上
javaee-
hibernate-
都在排除列表中。
Properties p = new Properties();
p.put("openejb.deployments.classpath.exclude", "");
p.put("openejb.deployments.classpath.include", ".*");
container = EJBContainer.createEJBContainer(p);
INFO - Cannot find the configuration file [conf/openejb.xml].  Will attempt to create one for the beans deployed.