javax.naming.NameNotFoundException 在外部 library/jar

javax.naming.NameNotFoundException in external library/jar

我在部署在自由服务器上的应用程序中得到一个 javax.naming.NameNotFoundException:

javax.naming.NameNotFoundException: javax.naming.NameNotFoundException: java:app/ExternalEJB/EJBBean!com.example.server.ejb.SecurityEJB
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:355)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:370)
    at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)
    at javax.naming.InitialContext.lookup(InitialContext.java:428)
    at com.example.connect.server.ServiceProvider.getLocal(ServiceProvider.java:153)
    at com.example.connect.server.ServiceProvider.getLocal(ServiceProvider.java:122)
    at com.example.connect.server.ServiceProvider.getService(ServiceProvider.java:73)
    at com.example.connect.ConnectFactory.makeService(ConnectFactory.java:300)
    at com.example.connect.ConnectFactory.getService(ConnectFactory.java:280)
    at com.example.connect.ConnectFactory.getService(ConnectFactory.java:252)
    at com.example.server.ejb.EJBWrapper.getService(EJBWrapper.java:91)
    at com.example.server.ejb.EJBWrapper.find(EJBWrapper.java:1231)
    at com.example.server.bo.PersonBO.find(PersonBO.java:233)
    at de.example.framework.Wrapper.find(Wrapper.java:102)

申请结构如下:

Appl.ear
|
├──Module1.war (de.example.framework)
├──Module2.war
├──EJBModule.war
|
└───/lib
    ├───ExternalLib.jar (com.example.server)
    |   └── ExternalEJB (EJBBean implements SecurityEJB)
    |
    ├───ExternalLib2.jar (com.example.connect)
    |
    └───MyOwnLib.jar (de.example.service)

现在我不知道为什么库找不到 jdni 名称(这两个库在其他项目中一起工作)。有什么建议我做错了吗? 如果您需要更多信息,我会尽量提供给您。

谢谢!

编辑: 由于这些库是外部库,我没有源代码,尽管使用像 JD 这样的工具我可以向您展示它们的样子:

EJBBean 声明:

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Local({SecurityEJB.class})
public class EJBBean extends BaseStatelessSessionBean implements SecurityEJB {

getLocal 方法:

protected static <T> T getLocal(Class<T> cls, String jndiName) throws GenException {
    if (log.isDebugEnabled()) {
      log.debug("class        : " + cls);
      log.debug("jndi         : " + jndiName);
    } 
    Context ctx = null;
    Object local = null;
    try {
      ctx = getContext();
      if (log.isDebugEnabled())
        log.debug("context      : " + ctx); 
      local = ctx.lookup(jndiName); <--- line 153
      if (log.isDebugEnabled()) {
        log.debug("local        : " + local);
        log.debug(" class       : " + local.getClass().getName());
        log.debug(" class loader: " + local.getClass().getClassLoader());
      } 
      return (T)local;
    } catch (NamingException ex) {
      throw new GenException(ex);
    } 
  }

SecurityEJB 接口:

public interface SecurityEJB extends ICompressible {
  public static final String JNDI_NAME = "java:app/ExternalEJB/EJBBean!" + SecurityEJB.class
    .getName();

server.xml中的特征:

<featureManager>
    <feature>javaee-8.0</feature>
    <feature>localConnector-1.0</feature>
    <feature>ejbRemote-3.2</feature>
    <feature>ldapRegistry-3.0</feature>
    <feature>transportSecurity-1.0</feature>
</featureManager>

根据 Java EE 平台规范(部署 Java EE 应用程序),如果模块不在 lib 目录中并且包含META-INF/ejb-jar.xml 文件或定义注释的 EJB 组件,例如 @Stateless.

在此示例中,由于 EJBBean class 在 lib/ExternalLib.jar 中,因此 @Stateless 注释将被忽略。 ExternalLib.jar JAR 文件不被视为 EJB 模块,因为它位于 lib 目录中。

ExternalLib.jar 要么需要移出 lib 目录,要么其他 EJB 或 WAR 模块之一需要包含一个 ejb-jar.xml 文件,该文件声明EJBBean 成为 EJB。 lib 目录中的所有 classes 都可能被 EJB 和 WAR 模块引用,因此可以将 lib 模块中的 class 声明为 ejb-jar.xml WAR 或 EJB 模块的文件。请注意,java: 查找将使用 ejb-jar.xml 文件所在的模块名称;绝不是 lib 目录中 JAR 的名称。