什么导致难以捉摸:NoSuchMethodError:org.jboss.remoting3.Remoting.createEndpoint()?

时间:2017-07-30 23:45:33

标签: java jboss wildfly jndi

很多人都对此错误寻求帮助:

javax.naming.NamingException: Failed to create remoting connection [Root exception is java.lang.NoSuchMethodError: org.jboss.remoting3.Remoting.createEndpoint(Ljava/lang/String;Lorg/xnio/OptionMap;)Lorg/jboss/remoting3/Endpoint;]

at
org.jboss.naming.remote.client.ClientUtil.namingException(ClientUtil.java:51)

at
org.jboss.naming.remote.client.InitialContextFactory.getInitialContext(InitialContextFactory.java:152)

at
javax.naming.spi.NamingManager.getInitialContext(Unknown Source)

...

但我找不到的任何请求都能提供一个确凿的答案。只是建议修补罐子。

我认为这是因为Jboss接口的结构存在不一致。任何人都可以确认或纠正吗?

这是我的代码抛出上述错误:

final private Properties env = new Properties() {
  {put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");  
   put(Context.PROVIDER_URL, "http-remoting://localhost:9990");
   put(Context.SECURITY_PRINCIPAL, "myID");  
   put(Context.SECURITY_CREDENTIALS, "myPassword");
   put("jboss.naming.client.ejb.context", true);  
  }
};
/****************************************************
 * myID & myPassword open the Admin GUI for wildfly *
 * on localhost:9990                                *
 ****************************************************/

Context ctx = new InitialContext(this.env);

为了确定所需的罐子,我从Build路径中删除了所有罐子。 然后我运行我的程序直到所有ClassNotFoundException都消失了。

第一次错误

java.lang.ClassNotFoundException:
org.jboss.naming.remote.client.InitialContextFactory]

将jboss-remote-naming-1.0.7.final.jar添加到类路径

第二次错误

java.lang.NoClassDefFoundError:
org/jboss/logging/Logger

添加了jboss-logging.jar

第三次错误

java.lang.NoClassDefFoundError: 
org/xnio/Options

添加了xnio-api-3.0.7.ga.jar

第四次错误

java.lang.NoClassDefFoundError:
org/jboss/remoting3/spi/ConnectionProviderFactory

添加了jboss-remoting-3.jar

第五次错误

java.lang.NoClassDefFoundError:
org/jboss/ejb/client/EJBClientContextIdentifier

添加了jboss-ejb-client-1.0.19.final.jar

最终和致命错误 (注意:所有NoClassDefFoundError都已清除)

java.lang.NoSuchMethodError: org.jboss.remoting3.Remoting.createEndpoint(Ljava/lang/String;Lorg/xnio/OptionMap;)Lorg/jboss/remoting3/Endpoint;]

使用Eclipse的Project Explorer我验证了:

一个。 jboss-remoting3.jar有org.jboss.remoting3.Remoting类。

湾Remoting Class有这个方法:

public Endpoint createEndpoint(String,Executor,OptionMap)

注意它需要3个参数。

但是上面的最终致命错误要求

public Endpoint createEndpoint(String,OptionMap)

注意:它需要2个参数。因此NoSuchMethodError。

我想,看看堆栈跟踪中的顶行 org.jboss.naming.remote.client.InitialContextFactory.getInitialContext()尝试使用2个参数调用org.jboss.remoting3.Remoting.createEndpoint(),但org.jboss.remoting3.Remoting仅定义了带有3的createEndpoint() -paramater签名。

这应该是可能的吗? 一个jar说它有org.jboss.remoting3包,其Remoting类有一个带有3参数签名的createEndpoint()方法,另一个jar说它有org.jboss.remoting3包,其Remoting类有另一个createEndpoint ()方法带有2参数签名?

HELP!

我的意思是我是否需要查看每个org.jboss.remoting3包以找到其Remoting类具有2参数createEnpoint()方法的包?

或者我错过了重要的事情。

我的意思是这确实解释了关于此错误发布的问题:

javax.naming.NamingException: Failed to create remoting connection [Root exception is java.lang.NoSuchMethodError: org.jboss.remoting3.Remoting.createEndpoint(Ljava/lang/String;Lorg/xnio/OptionMap;)Lorg/jboss/remoting3/Endpoint;]

并解释为什么除了摆弄罐子和构建路径之外,从来没有一个确凿的解释或解决方案。

我的意思是从WildFly获取一个InitialContext在同一台PC上运行,因为Java程序应该是一个简单的过程。但事实并非如此。也许这是因为API的不一致。

1 个答案:

答案 0 :(得分:0)

感谢ChristophBöhme:

jboss-logging-3.1.4.GA.jar 有一个带有Remoting类的org.jboss.remeoting包,该类具有带有0,2和3参数签名的createEndpoint()。

用上面的jar替换 jboss-remoting-4.0.7.Final.jar 是清除NoSuchMethodError所需的全部内容。

希望能帮助他人。