【发布时间】:2015-04-12 23:30:32
【问题描述】:
我正在开发一个将在 Java EE 应用程序中使用的框架,因此很可能部署在 EAR 文件的 \lib 目录中。
该框架将使用 CDI 以编程方式查找和注入位于使用该框架的 Java EE 应用程序中的 bean。我遇到的问题是,当我的框架调用来自javax.enterprise.Provider<T> 的Provider.get() 方法来获取bean 的实例时,Weld 会抛出UnsatisfiedResolutionException。
为了检查这不是与 CDI 相关的问题,我还尝试使用 MyClass myClass = Class.forName(clazz).newInstance(); 获取类的实例,但抛出了 ClassNotFoundException。
我用于测试目的的EAR文件的结构如下:
MyTestApp.ear
+\lib\MyFramework.jar <----Contains the framework invoking the Provider.get() method
+MyTestApp.jar <----Contains the bean I want to inject
我的测试应用程序的 EAR 包含一个 application.xml 文件,其中包括 <library-directory>lib</library-directory>。
我相信这个问题的发生是因为我要注入的 bean 存在于一个单独的类加载器中。即\lib\MyFramework.jar 与MyTestApp.jar 在不同的类加载器中。我发现了这个SO question,这似乎表明情况就是这样。鉴于我正在开发一个框架,我不认为问题中的答案是满足我需求的可行解决方案。
我很想知道创建 CDI 可移植扩展是否可以让我获得我想要使用的 bean 的实例,但在这方面没有足够的经验。使用@Observes ProcessAnnotatedType<T>,我可以在EAR 文件中看到存在于\lib 目录之外的bean,包括我想以编程方式注入的bean。
我的问题是:
-
我是否正确假设因为
\lib\MyFramework.jar和MyTestApp.jar位于不同的类加载器中而发生此问题? -
我可以使用 CDI 做些什么来让我的框架在部署在 EAR 文件的
\lib目录中时调用Provider.get()方法以避免 Weld 抛出UnsatisfiedResolutionException? -
在 CDI 之外我可以做些什么来达到相同的结果吗?
更新
我现在尝试将 MyFramework.jar 移动到 EAR 文件的根目录,并将 jar 模块包含在 application.xml 文件中,但由于 CDI 未满足依赖项异常,容器无法启动应用程序。当 MyFramework.jar 位于 \lib 目录中并且与我的问题中引用的 bean 不同时,可以注入异常中引用的 bean。
【问题讨论】:
-
你提到了焊接。您要部署到什么容器?包括名称和版本。
-
我有两个要部署到的应用服务器。第一个是运行 Weld 2.0.0 SP1 的 GlassFish 4。第二个是运行 Weld 2.2.10 SP1 的 GlassFish 4.1。
标签: java jakarta-ee classloader cdi weld