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

Wildfly 27客户端Shaded JAR无法获取TopicConnectionFactory报错WFNAM00026

解决Wildfly 27 JMS客户端打包后JNDI查找报错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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:33:24