WildFly 10部署Java EE 7应用时PicketLink类缺失问题求助
你遇到的这个问题其实很典型——WildFly 10确实内置了PicketLink模块,但默认情况下你的应用并不会自动引用它,而且手动添加外部PicketLink依赖反而会引发类加载冲突,导致更多的缺失异常。下面是一步步的解决方案:
移除手动添加的PicketLink依赖
首先把你加到EAR lib目录里的picketlink-impl:2.5.5.SP2依赖删掉。WildFly内置的PicketLink版本和你手动添加的版本可能存在类结构差异,混合使用会让类加载器陷入混乱,出现你看到的Failed to link org/picketlink/internal/AbstractIdentity这类错误。配置应用引用WildFly内置的PicketLink模块
你需要在应用中添加jboss-deployment-structure.xml文件,明确告诉WildFly要加载内置的PicketLink模块:- 如果是EAR项目,把这个文件放在EAR的META-INF目录下;如果是WAR项目,放在WAR的WEB-INF目录下。
- 文件内容如下:
<jboss-deployment-structure> <deployment> <dependencies> <module name="org.picketlink" slot="main" /> </dependencies> </deployment> </jboss-deployment-structure>这个配置会让WildFly的模块加载器把内置的PicketLink模块提供给你的应用使用。
确认内置PicketLink模块的存在
可以去WildFly的安装目录下检查modules/system/layers/base/org/picketlink/main路径,看看是否有picketlink.jar和module.xml文件。如果缺失的话,可能是你安装的WildFly版本不包含这个模块,需要重新下载完整的WildFly 10包,或者手动添加PicketLink模块(不过默认完整版是包含的)。检查代码中的注入正确性
确保你在代码中注入Identity的方式是正确的,比如:import javax.inject.Inject; import org.picketlink.Identity; public class YourSecurityService { @Inject private Identity identity; // ... 其他代码 }这里一定要用
javax.inject.Inject注解,而不是其他自定义的注入注解,避免依赖注入失败导致类无法初始化。
总结一下,核心问题就是你的应用没有正确引用WildFly内置的PicketLink模块,而手动添加外部依赖又引发了类加载冲突。按照上面的步骤调整后,应该就能解决NoClassDefFoundError的问题了。
内容的提问来源于stack exchange,提问作者Georg Leber

