gpt4 book ai didi

java - 如何注入(inject)存在于另一个类加载器中的 CDI 托管 Bean

转载 作者:行者123 更新时间:2023-12-02 12:26:19 26 4
gpt4 key购买 nike

我正在开发一个将在 Java EE 应用程序中使用的框架,因此很可能部署在 \lib 中EAR 文件的目录。

该框架将使用 CDI 以编程方式查找和注入(inject)位于使用该框架的 Java EE 应用程序中的 Bean。我遇到的问题是当 Provider.get()方法来自javax.enterprise.Provider<T>由我的框架调用以获取 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> .

我相信发生这个问题是因为我想要注入(inject)的 bean 存在于单独的类加载器中。即\lib\MyFramework.jarMyTestApp.jar 位于不同的类加载器中。我找到了这个SO question这似乎表明情况确实如此。鉴于我正在开发一个框架,我不认为问题的答案是满足我的需求的可行解决方案。

我很想知道创建 CDI 可移植扩展是否允许我获得我想要使用的 bean 实例,但在这方面没有足够的经验。使用@Observes ProcessAnnotatedType<T>我可以看到 \lib 之外存在的 beans EAR 文件中的目录,包括我想要以编程方式注入(inject)的目录。

我的问题是:

  1. 我假设发生此问题是否正确,因为 \lib\MyFramework.jarMyTestApp.jar位于单独的类加载器中?

  2. 我可以使用 CDI 做些什么来允许我的框架部署在 \lib 中吗? EAR 文件的目录,使 Provider.get()方法调用以避免 Weld 抛出 UnsatisfiedResolutionException

  3. 在 CDI 之外我可以做些什么来达到相同的结果吗?

<小时/>

更新

我现在尝试移动 MyFramework.jar到 EAR 文件的根目录,并且还包括 application.xml 中的 jar 模块文件,但由于 CDI 不满足依赖异常,容器无法启动应用程序。当MyFramework.jar时可以注入(inject)异常中引用的bean位于\lib目录,并且与我的问题中引用的 bean 不同。

最佳答案

1:是

2:其实我不知道

3:是的,您必须了解ear类加载器层次结构,ear lib目录中的jar在ear级别加载,因此在所有子类加载器中都可用(ear中每个组件都有一个子类加载器)。

这意味着 MyFramework.jar 从 MyTestApp.jar 耳朵子类加载器中可见,但反之则为 false。

参见In java EE, which jars should I put in the library dir?

您可以:

  • 将 MyTestApp.jar 移至 Ear lib 目录(MyFramework.jar 可以位于 lib 目录并引用 MyTestApp.jar 或位于 Ear 根目录中)
  • 将 MyFramework.jar 移至耳朵根并在其 list 类路径中引用 MyTestApp.jar

参见Deployment of multiple, depended CDI jars in one EAR

关于java - 如何注入(inject)存在于另一个类加载器中的 CDI 托管 Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com