我在JBOSS 5.1上有一个企业应用程序。它需要远程访问部署在另一个JBOSS AS 7.0+实例上的EJB。 现在,AS 7.0+远程访问EJB协议已经发生变化,并且依赖于jboss-client.jar文件内容进行远程访问。
来自7.0+的jboss-client.jar中的一些类与5.1中可用的库(例如:org.jboss.logging.Logger)具有相同的结构。但是这两个类都有不同的方法。
从5.1调用远程EJB,如下所示
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
context = new InitialContext(jndiProperties);
final String appName = "my-ear";
final String moduleName = "my-ejb-1.0";
final String distinctName = "";
final String beanName = "ServiceBean";
final String viewClassName = "org.test.Service";
// let's do the lookup
Service service = (Service) context.lookup("ejb:" + appName + "/"
+ moduleName + "/" + distinctName + "/" + beanName + "!"
+ viewClassName + "?stateful");
导致org.jboss.logging.Logger.getMessageLogger的NoSuchMethodException
这是因为JBOSS 5.1有一个名为'jboss-logging-spi.jar'的库,它包含与上面完全相同的类(Logger)。因此,JVM尝试在'jboss-logging-spi.jar'中定义的Logger类上调用getMessageLogger,而不是'jboss-client.jar'。
关于如何强制JVM寻找合适的类(jboss-client.jar中的Logger)的任何想法?
到目前为止,我尝试了这个选项:
解决从JBOSS 5.1上运行的应用程序调用JBOSS 7.0+上远程托管的EJB问题的任何想法?
答案 0 :(得分:0)
为了解决类版本问题,第三个选项看起来是正确的方法。
我从您发布的链接中看到的是,可能you need要向Classloading元素添加属性:
parent-first="false"
parent-first(true / false) - 类加载器应该首先加载 你的战争/耳朵/罐子然后从父母的一切(如果是的话) 耳内的战争/罐子意味着耳朵,否则就是JBossAS)
另外,在处理Classloder配置,启用jboss classloder logging和使用JMX Console时,有一些工具可能很有用。
我希望这可以提供帮助。