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 的名称。
我在部署在自由服务器上的应用程序中得到一个 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 的名称。