Wildfly 27客户端Shaded JAR无法获取TopicConnectionFactory报错WFNAM00026
核心问题定位
你遇到的WFNAM00026: No provider for found for URI: null错误,本质是JNDI查找时找不到对应的服务提供者,大概率和Maven Shade打包时的依赖处理、资源合并不完整有关。Eclipse中运行正常是因为IDE自动加载了所有依赖和配置,而Shade打包时可能遗漏了关键内容。
具体解决步骤
1. 修正Wildfly JMS客户端依赖的引入方式
打包日志中跳过的org.wildfly:wildfly-jms-client-bom:pom:27.0.1.Final是POM类型的BOM(物料清单),它本身不包含代码,只用来统一管理依赖版本。Shade插件不会自动解析BOM中的依赖,所以你需要:
- 在
pom.xml的dependencyManagement中引入这个BOM,确保所有相关依赖版本统一:<dependencyManagement> <dependencies> <dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-jms-client-bom</artifactId> <version>27.0.1.Final</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 然后在
dependencies节点中显式引入实际需要的客户端依赖,比如:<dependencies> <dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-jms-client</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-naming-client</artifactId> <scope>compile</scope> </dependency> </dependencies>
2. 配置Maven Shade插件,合并关键资源
Wildfly的JNDI和JMS客户端依赖大量使用ServiceLoader机制,需要读取META-INF/services下的配置文件。Shade默认不会合并这些文件,导致找不到服务提供者,需要在Shade插件中添加资源合并规则:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并ServiceLoader配置文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 保留主类入口 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>你的主类全路径</mainClass> </transformer> <!-- 合并Wildfly的客户端配置文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/wildfly-client.properties</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
3. 验证JNDI初始化的环境参数
确保你的InitialContext初始化时,正确设置了必要的环境变量,比如:
Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory"); env.put(Context.PROVIDER_URL, "http-remoting://你的Wildfly服务器地址:端口"); env.put(Context.SECURITY_PRINCIPAL, "用户名"); env.put(Context.SECURITY_CREDENTIALS, "密码"); InitialContext initialContext = new InitialContext(env);
打包后要确认这些参数没有遗漏,比如如果是从配置文件读取,要确保配置文件被Shade正确包含在JAR中(可以解压Shaded JAR检查)。
4. 检查Launch4j的配置
Launch4j只是把JAR包装成EXE,核心问题还是在Shaded JAR上。确保Launch4j指向的是正确的Shaded JAR,并且没有修改JVM启动参数导致依赖加载异常。可以先直接运行Shaded JAR(用java -jar xxx.jar)确认问题是否解决,再用Launch4j打包。
验证方法
- 解压Shaded JAR,检查
META-INF/services下是否包含javax.naming.spi.InitialContextFactory等文件,并且文件内容包含Wildfly的实现类。 - 检查
META-INF/wildfly-client.properties是否存在,内容是否正确。
内容的提问来源于stack exchange,提问作者derYak

