Wildfly24部署Jackrabbit JCA仓库遇JNDI连接异常求助
Jackrabbit JCA仓库部署在Wildfly 24上的远程连接异常排查
我在Wildfly 24上部署了Jackrabbit JCA仓库(因客户端仍使用Java 7,无法使用Elytron),连接时出现两类核心异常:javax.resource.Referenceable类找不到,以及CachedConnectionManagerImpl序列化失败。以下是详细信息及排查方案:
异常日志
Exception in thread "naming-client-message-receiver-1-thread-1" java.lang.NoClassDefFoundError: javax/resource/Referenceable at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:131) at org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:112) at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:948) at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1255) at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276) at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209) at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41) at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:156) at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:149) at org.jboss.naming.remote.protocol.v1.BaseProtocolCommand.readResult(BaseProtocolCommand.java:59) at org.jboss.naming.remote.protocol.v1.Protocol$1.handleClientMessage(Protocol.java:149) at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1$MessageReceiver$1.run(RemoteNamingStoreV1.java:232) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: javax.resource.Referenceable at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 29 more Exception in thread "main" org.jboss.naming.remote.protocol.NamingIOException: Failed to lookup [Root exception is java.io.NotSerializableException: org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl] at org.jboss.naming.remote.client.ClientUtil.namingException(ClientUtil.java:49) at org.jboss.naming.remote.protocol.v1.Protocol$1.execute(Protocol.java:104) at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1.lookup(RemoteNamingStoreV1.java:95) at org.jboss.naming.remote.client.HaRemoteNamingStore$1.operation(HaRemoteNamingStore.java:276) at org.jboss.naming.remote.client.HaRemoteNamingStore.namingOperation(HaRemoteNamingStore.java:137) at org.jboss.naming.remote.client.HaRemoteNamingStore.lookup(HaRemoteNamingStore.java:272) at org.jboss.naming.remote.client.RemoteContext.lookupInternal(RemoteContext.java:104) at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:93) at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:146) at javax.naming.InitialContext.lookup(InitialContext.java:411) at com.mycompany.testnewjcr.NewMain.main(NewMain.java:78) Caused by: java.io.NotSerializableException: org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:274) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1143) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1101) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1080) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:268) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1143) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:1101) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:268) at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58) at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111) at org.wildfly.naming.client.remote.RemoteServerTransport.writeSuccessResponse(RemoteServerTransport.java:479) at org.wildfly.naming.client.remote.RemoteServerTransport.handleLookup(RemoteServerTransport.java:210) at org.wildfly.naming.client.remote.RemoteServerTransport$1.handleMessage(RemoteServerTransport.java:123) at org.jboss.remoting3.remote.RemoteConnectionChannel.lambda$handleMessageData$3(RemoteConnectionChannel.java:432) at org.jboss.remoting3.EndpointImpl$TrackingExecutor.lambda$execute$0(EndpointImpl.java:991) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1280) at java.lang.Thread.run(Thread.java:833) Caused by: an exception which occurred: in field org.jboss.jca.core.connectionmanager.AbstractConnectionManager.cachedConnectionManager in object org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl@664d5391 in field org.apache.jackrabbit.jca.JCARepositoryHandle.cm in object org.apache.jackrabbit.jca.JCARepositoryHandle@161283b5 in object org.apache.jackrabbit.jca.JCARepositoryHandle@161283b5 Exception in thread "naming-client-message-receiver-2-thread-1" java.lang.NoClassDefFoundError: javax/resource/Referenceable at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:131) at org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:112) at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:948) at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1255) at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276) at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209) at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41) at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:156) at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:149) at org.jboss.naming.remote.protocol.v1.BaseProtocolCommand.readResult(BaseProtocolCommand.java:59) at org.jboss.naming.remote.protocol.v1.Protocol$1.handleClientMessage(Protocol.java:149) at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1$MessageReceiver$1.run(RemoteNamingStoreV1.java:232) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: javax.resource.Referenceable at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 29 more
客户端代码
final Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); //env.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory"); env.put(Context.PROVIDER_URL, "http-remoting://xxx.xxx.xxx.xxx:8080"); env.put(Context.SECURITY_PRINCIPAL, "****"); env.put(Context.SECURITY_CREDENTIALS, "****"); env.put("jboss.naming.client.ejb.context", true); InitialContext remoteContext = new InitialContext(env); RemoteRepository rr = (RemoteRepository) remoteContext.lookup("jcr/local"); Repository repository = null; if (rr != null) { ClientAdapterFactory adapter = new ClientAdapterFactory(); repository = adapter.getRepository(rr); }
客户端依赖配置
<dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-ejb-client-bom</artifactId> <version>10.0.0.Final</version> <type>pom</type> </dependency> <dependency> <groupId>org.apache.jackrabbit</groupId> <artifactId>jackrabbit-jca</artifactId> <version>2.14.9</version> </dependency>
Wildfly资源适配器配置
<subsystem xmlns="urn:jboss:domain:resource-adapters:6.0"> <resource-adapters> <resource-adapter id="jackrabbit-jca-2.21.14.rar" statistics-enabled="true"> <archive> jackrabbit-jca-2.21.14.rar </archive> <connection-definitions> <connection-definition class-name="org.apache.jackrabbit.jca.JCAManagedConnectionFactory" jndi-name="java:jboss/exported/jcr/local" enabled="true" use-java-context="true" pool-name="jackrabbit-jca-Pool" use-ccm="true"> <config-property name="bindSessionToTransaction">true</config-property> <config-property name="homeDir">/mnt/backup/jcr</config-property> <config-property name="configFile">/mnt/backup/jcr/repository.xml</config-property> <security> <application/> </security> <validation> <background-validation>false</background-validation> </validation> </connection-definition> </connection-definitions> </resource-adapter> </resource-adapters> </subsystem>
问题分析
javax.resource.Referenceable类缺失:客户端Java 7环境未包含JCA API依赖,Wildfly 24使用Jakarta EE 8,但Java 7仅兼容Java EE 7及以下的javax.resource包,当前依赖未覆盖该类。CachedConnectionManagerImpl序列化失败:Jackrabbit的JCARepositoryHandle持有Wildfly连接管理器的引用,而CachedConnectionManagerImpl不可序列化,远程查找时无法传输该对象。这是因为use-ccm="true"开启了连接管理器缓存功能,导致该实例被绑定到仓库句柄中。
解决步骤
添加客户端JCA API依赖
在客户端pom中补充Java EE 7版本的JCA API,提供缺失的javax.resource.Referenceable类:<dependency> <groupId>javax.resource</groupId> <artifactId>javax.resource-api</artifactId> <version>1.7</version> </dependency>关闭Wildfly连接管理器缓存
修改Wildfly配置,将use-ccm="true"改为use-ccm="false",避免JCARepositoryHandle持有不可序列化的管理器引用:<connection-definition class-name="org.apache.jackrabbit.jca.JCAManagedConnectionFactory" jndi-name="java:jboss/exported/jcr/local" enabled="true" use-java-context="true" pool-name="jackrabbit-jca-Pool" use-ccm="false"> <!-- 其他配置保持不变 --> </connection-definition>对齐Jackrabbit版本
服务端部署的是jackrabbit-jca-2.21.14.rar,客户端依赖的是2.14.9,版本不一致可能引发序列化兼容问题,将客户端依赖版本同步为2.21.14:<dependency> <groupId>org.apache.jackrabbit</groupId> <artifactId>jackrabbit-jca</artifactId> <version>2.21.14</version> </dependency>调整Wildfly EJB Client版本
当前客户端使用的wildfly-ejb-client-bom版本为10.0.0.Final,与Wildfly 24兼容性较差。若Java 7兼容,可升级到24.0.1.Final;若不兼容,降级到最后一个支持Java 7的Wildfly版本18.0.1.Final的EJB Client:<dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-ejb-client-bom</artifactId> <version>18.0.1.Final</version> <type>
相关产品推荐
相关产品推荐

