You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WildFly 29中EJB调用遇ClassNotFoundException与NamingException求助

EJB客户端ClassNotFoundException问题解决

我是Java Bean尤其是Enterprise Java Bean(EJB)的初学者,查阅资料后编写了一个简单的服务端应用并部署到WildFly 29中。随后编写客户端应用进行测试时,出现了如下错误:

Oct 06, 2023 1:36:10 PM org.jboss.logmanager.JBossLoggerFinder getLogger
ERROR: The LogManager accessed before the "java.util.logging.manager" system property was set to "org.jboss.logmanager.LogManager". Results may be unexpected.
Exception in thread "main" javax.naming.NamingException: Failed to lookup [Root exception is java.lang.ClassNotFoundException: com.mamisa.MamisoaRemote]
        at org.wildfly.naming.client.util.NamingUtils.namingException(NamingUtils.java:171)
        at org.wildfly.naming.client.remote.RemoteClientTransport.lookup(RemoteClientTransport.java:291)
        at org.wildfly.naming.client.remote.RemoteContext.lambda$lookupNative$0(RemoteContext.java:190)
        at org.wildfly.naming.client.NamingProvider.performExceptionAction(NamingProvider.java:222)
        at org.wildfly.naming.client.remote.RemoteContext.performWithRetry(RemoteContext.java:100)
        at org.wildfly.naming.client.remote.RemoteContext.lookupNative(RemoteContext.java:188)
        at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:74)
        at org.wildfly.naming.client.store.RelativeFederatingContext.lookupNative(RelativeFederatingContext.java:58)
        at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:74)
        at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:60)
        at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:66)
        at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:144)
        at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
        at App.main(App.java:19)
Caused by: java.lang.ClassNotFoundException: com.mamisa.MamisoaRemote
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:129)
        at org.jboss.marshalling.AbstractClassResolver.resolveProxyClass(AbstractClassResolver.java:141)
        at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:1036)
        at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1381)
        at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:298)
        at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:231)
        at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41)
        at org.wildfly.naming.client.remote.RemoteClientTransport.lookup(RemoteClientTransport.java:275)
        ... 12 more

服务端代码

远程接口

package com.mamisa;
import jakarta.ejb.Remote;

@Remote
public interface MamisoaRemote{
    public void hello();
}

EJB实现类

package com.mamisa;
import jakarta.ejb.Remote;
import jakarta.ejb.Stateless;

@Stateless
public class Mamisoa implements MamisoaRemote{
    @Override
    public void hello() {
        System.out.println("hello");
    }
}

客户端代码

import java.util.Hashtable;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.mamisa.MamisoaRemote;

public class App{
    public static void main(String[] args) throws NamingException {
        final Hashtable jndiProperties = new Hashtable();
        jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
        jndiProperties.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080/");

        Context context = new InitialContext(jndiProperties);
        MamisoaRemote mr = (MamisoaRemote) context.lookup("mamisosa/Mamisoa!com.mamisa.MamisoaRemote");
        mr.hello();
    }
}

解决方案

  • 同步远程接口到客户端
    核心错误是客户端找不到com.mamisa.MamisoaRemote类,需要将服务端的这个接口类(保持包名完全一致)添加到客户端的类路径中。可以把接口单独打包成jar,或者直接复制class文件到客户端项目的对应包目录下。

  • 修正JNDI查找名称
    客户端lookup的名称mamisosa/Mamisoa!com.mamisa.MamisoaRemote存在拼写错误(mamisosa多了一个s,应为mamisoa)。另外WildFly中远程EJB的标准JNDI格式为:

    ejb:<应用名>/<模块名>/<Bean类名>!<远程接口全限定名>
    

    如果部署的jar没有指定应用名和模块名,可简化为ejb:/Mamisoa!com.mamisa.MamisoaRemote,或者查看WildFly启动日志,找到EJB部署时输出的准确JNDI绑定信息。

  • 解决日志管理器警告
    在启动客户端时添加JVM参数:

    -Djava.util.logging.manager=org.jboss.logmanager.LogManager
    

    同时确保客户端依赖中包含jboss-logmanager相关jar包。

  • 检查客户端依赖完整性
    客户端需要引入WildFly远程EJB客户端的依赖,确保类路径中包含wildfly-naming-client、jboss-marshalling等必要jar包,避免因依赖缺失导致类加载问题。

内容的提问来源于stack exchange,提问作者G2HP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:25:24