WFLYNAM0027:ClassNotFoundException:org.jboss.naming.remote.client.InitialContextFactory

WFLYNAM0027 : ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory

环境-wildfly-9.0.2.Final,EJB 3.0

尝试将 Test.java class(作为模块部署在 wildfly-9.0.2.Final@machine-A 上)连接到部署在 [=107 上的 EJB 时发生以下错误=] 在机器 B(291.861.301.732)。

17:02:46,666 ERROR [stderr] (default task-1) javax.naming.NamingException: WFLYNAM0027: Failed instantiate InitialContextFactory org.jboss.naming.remote.client.InitialContextFactory from classloader ModuleClassLoader for Module "deployment.test.ear.test.war:main" from Service Module Loader [Root exception is java.lang.ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory from [Module "deployment.test.ear.test.war:main" from Service Module Loader]]
17:02:46,667 ERROR [stderr] (default task-1)    at org.jboss.as.naming.InitialContext.getDefaultInitCtx(InitialContext.java:118)
17:02:46,667 ERROR [stderr] (default task-1)    at org.jboss.as.naming.InitialContext.init(InitialContext.java:99)
17:02:46,670 ERROR [stderr] (default task-1)    at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154)
17:02:46,670 ERROR [stderr] (default task-1)    at org.jboss.as.naming.InitialContext.<init>(InitialContext.java:89)
17:02:46,670 ERROR [stderr] (default task-1)    at org.jboss.as.naming.InitialContextFactory.getInitialContext(InitialContextFactory.java:43)
17:02:46,687 ERROR [stderr] (default task-1) Caused by: java.lang.ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory from [Module "deployment.test.ear.test.war:main" from Service Module Loader]
17:02:46,688 ERROR [stderr] (default task-1)    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
17:02:46,688 ERROR [stderr] (default task-1)    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
17:02:46,688 ERROR [stderr] (default task-1)    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
17:02:46,688 ERROR [stderr] (default task-1)    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
17:02:46,688 ERROR [stderr] (default task-1)    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)

Test.java class 存在于 testclient.jar 中并且 testclient.jar 已使用命令

作为模块部署
module add --name=testclient --resources=/Downloads/lib/test/client/testclient.jar --dependencies=javax.api

Test.java class

package com.testmodule.pojo;

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Test { 
public void getDbConnection(){
    try{
        Properties jndiProps = new Properties();
        jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory");
        jndiProps.put(Context.PROVIDER_URL,"remote://291.861.301.732:4447");
        jndiProps.put(Context.SECURITY_PRINCIPAL, "testuser");
        jndiProps.put(Context.SECURITY_CREDENTIALS, "testpassword");
        jndiProps.put("jboss.naming.client.ejb.context", true);
        Context context = new InitialContext(jndiProps);
    }
    catch(Exception e){e.printStackTrace();}
}}

为什么会出现这个错误,为了 'org.jboss.naming.remote.client.InitialContextFactory' 到 testclient.jar 的可见性,我是否必须 添加更多依赖项(目前只有 javax.api) 同时将 testclient.jar 作为模块部署?或任何其他导致错误的问题? Class 'org.jboss.naming.remote.client.InitialContextFactory' 也出现在 $WILDFLY_HOME/bin/client/jboss-client.jar

注意 - 291.861.301.732 是远程系统 ip,ejb 部署在 jboss。 ,此 ejb 正在使用 JNDI 从 Test.java(远程客户端)调用。

wildfly-9.0中没有jnp。2.Final(在JBOSS5.x中),所以我将属性"org.jnp.interfaces.NamingContextFactory"替换为value org.jboss.naming.remote.client.InitialContextFactory"。为什么还是出错?

'Sampada Wagde'

收到评论 'Try putting jboss-client.jar in the runtime path, as part of WEB-INF/lib maybe' 后添加了以下内容

我无法理解,在这种情况下 test.jsp(出现在 test.ear-->test.war-->test.jsp 中)文件正在调用函数 getDbConnection Test.java 个文件。 Test.java 文件存在于 testclient.jar 中并且此 testclient.jar 已作为模块部署。 按照你的建议,当我把'jboss-client.jar'放在test.ear-->test.war-->WEB-INF-->lib中,问题就解决了,现在访问 application 'org.jboss.naming.remote.client.InitialContextFactory' ClassNotFound 异常没有发生...但我的问题是有多个 war 的文件(例如..test.war, test1.war,test2.war) 并且每个 war 文件正在访问 Test.java 文件(存在于 testclient.jar),所以我必须将 'jboss-client.jar' 文件放入每个 war 个存档的 WEB-INF/lib。这对我来说会很复杂,还有其他可用的方法吗? 其次,如何通过将 'jboss-client.jar' 放入 WEB-INF/lib 目录来解决这个问题,因为 'org.jboss.naming.remote.client.InitialContextFactory' 存在于testclient.jar(不在test.ear-->test.war)。

收到 'jboss-client.jar is required by the server at runtime...' 'Sampada Wagde'

的回复后添加了以下内容

我也试过以下步骤 1.通过把'jboss-deployment-structure.xml'放在test.ear-->META-INF-->jboss-deployment-structure.xml

<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
    <dependencies>
        <module name="testclient" export="true" />
        <module name="jboss-client" export="true" />
    </dependencies>
</deployment>

  1. 部署模块名称为

    module add --name=jboss-client --resources=/Downloads/wildfly-9.0.2.Final/bin/client/jboss-client.jar
    

但还是出现如​​下错误

14:14:34,376 WARN  [org.jboss.modules] (default task-1) Failed to define class org.jboss.naming.remote.client.InitialContextFactory in Module "jboss-client:main" from local module loader @707f7052 (finder: local module finder @11028347 (roots: /Downloads/wildfly-9.0.2.Final/modules,/Downloads/wildfly-9.0.2.Final/modules/system/layers/base)): java.lang.LinkageError: Failed to link org/jboss/naming/remote/client/InitialContextFactory (Module "jboss-client:main" from local module loader @707f7052 (finder: local module finder @11028347 (roots: /Downloads/wildfly-9.0.2.Final/modules,/Downloads/wildfly-9.0.2.Final/modules/system/layers/base)))
at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:437)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:269)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:77)
at org.jboss.modules.Module.loadModuleClass(Module.java:560)
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:197)
Caused by: java.lang.NoClassDefFoundError: javax/naming/spi/InitialContextFactory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:353)
at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:432)
Caused by: java.lang.ClassNotFoundException: javax.naming.spi.InitialContextFactory from [Module "jboss-client:main" from local module loader @707f7052 (finder: local module finder @11028347 (roots: /Downloads/wildfly-9.0.2.Final/modules,/Downloads/wildfly-9.0.2.Final/modules/system/layers/base))]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
14:14:34,391 ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /test/test.jsp: javax.servlet.ServletException: java.lang.LinkageError: Failed to link org/jboss/naming/remote/client/InitialContextFactory (Module "jboss-client:main" from local module loader @707f7052 (finder: local module finder @11028347 (roots: /Downloads/wildfly-9.0.2.Final/modules,/Downloads/wildfly-9.0.2.Final/modules/system/layers/base)))
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:777)
at org.apache.jsp.test_jsp._jspService(test_jsp.java:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
Caused by: java.lang.LinkageError: Failed to link org/jboss/naming/remote/client/InitialContextFactory (Module "jboss-client:main" from local module loader @707f7052 (finder: local module finder @11028347 (roots: /Downloads/wildfly-9.0.2.Final/modules,/Downloads/wildfly-9.0.2.Final/modules/system/layers/base)))
at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:437)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:269)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:77)
at org.jboss.modules.Module.loadModuleClass(Module.java:560)
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:197)
Caused by: java.lang.NoClassDefFoundError: javax/naming/spi/InitialContextFactory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:353)
at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:432)
Caused by: java.lang.ClassNotFoundException: javax.naming.spi.InitialContextFactory from [Module "jboss-client:main" from local module loader @707f7052 (finder: local module finder @11028347 (roots: /Downloads/wildfly-9.0.2.Final/modules,/Downloads/wildfly-9.0.2.Final/modules/system/layers/base))]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
服务器在运行时需要

jboss-client.jar。有几种方法可以为 JBoss 服务器提供 jar -

  1. include jar in MANIFEST.MF(这通常用于您自己的应用程序 jar)
  2. 在 WEB-INF/lib 中包含 jar - 如果 jar 特定于给定的 Web 项目或 WAR
  3. 在模块 class 加载器中包含 jars 并通过 jboss-deploymet-structure.xml 将其提供给网络项目。这是在有多个 WARS 并且其中一些(不是全部)需要 jars 时完成的。
  4. 在模块 class 加载器中包含 jars,并通过 standalone.xml 中的全局模块将其提供给服务器。这是在服务器上部署的所有应用程序都引用 jars 时完成的。

JBoss中的模块详情请参考此link- https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

关于你的问题是如何将 jboss-client.jar 放在 WAR 而不是 testclient.jar 中解决问题,答案是一样的 -这就是 class 加载的工作原理。

你需要让你自己的模块依赖于一个模块,该模块不仅包含 jboss-client jar,还包含 jboss-client 的所有依赖项,这可能只是其他模块或者也可能是其他罐子。第一个 class 它抱怨丢失的是 javax/naming/spi/InitialContextFactory 所以编辑 module.xml 使 jboss-client 模块依赖于 javax.api