Maven 在WEB-INF/lib内的JAR中找不到CDI实例

Maven 在WEB-INF/lib内的JAR中找不到CDI实例,maven,jakarta-ee,jsf-2,ejb,cdi,Maven,Jakarta Ee,Jsf 2,Ejb,Cdi,我有一个maven JSF项目,其中有几个模块部署到Glassfish 3.1.2.2 结果EAR的结构: |-- lib |-- META-INF |-- core-module.jar (packaged as ejbModule by maven) | |-- com | | |-- ApplicationSettings.java | | |-- Module.java (Module interface) | | `-- ModuleCORE.java (i

我有一个maven JSF项目,其中有几个模块部署到Glassfish 3.1.2.2

结果EAR的结构:

|-- lib
|-- META-INF
|-- core-module.jar (packaged as ejbModule by maven)
|   |-- com
|   |   |-- ApplicationSettings.java
|   |   |-- Module.java (Module interface)
|   |   `-- ModuleCORE.java (implementation of Module interface)
|   `-- META-INF
|       `-- beans.xml
`-- presentation-module.war (packaged as warModule by maven)
    |-- WEB-INF
    |   |-- beans.xml
    |   `-- lib
    |       |-- jar-module.jar
    |       |   |-- com
    |       |   |   `-- ModuleEXT1.java (implementation of Module interface)
    |       |   `-- META-INF
    |       |       `-- beans.xml
    |       `-- another-jar-module.jar
    |           |-- com
    |           |   `-- ModuleEXT2.java (implementation of Module interface)
    |           `-- META-INF
    |               `-- beans.xml
    |-- images
    |-- css
    |-- js
    `-- listModules.xhtml
我有三个模块:

  • 核心模块
  • ext1模块
  • ext2模块
EJB模块中存在以下接口:

//Module.java
public interface Module {
    public String getName();
}
每个模块本身实现接口并返回其名称:

  • ModuleCORE.java
  • ModuleEXT1.java
  • ModuleEXT2.java
在核心模块中,有以下bean,
listModules.xhtml
用于显示模块列表:

//ApplicationSettings.java
@ApplicationScoped
@Named
public class ApplicationSettings {
    @Inject
    @Any
    private Instance<Module> modules;

    public List<String> getModuleList() {
        List<String> result = new ArrayList<String>();
        for (Module module : modules) {
            result.add(module.getName());
        }
        return result;
    }
}
//ApplicationSettings.java
@适用范围
@命名
公共类应用程序设置{
@注入
@任何
私有实例模块;
公共列表getModuleList(){
列表结果=新建ArrayList();
用于(模块:模块){
add(module.getName());
}
返回结果;
}
}
现在的问题是,只有核心模块的实现在实例列表中。尽管存在相应的
META-INF/beans.xml
,但未找到
WEB-INF/lib
中模块的实现

有人能解释一下为什么CDI找不到
模块
接口的所有实例吗


旁注:来自
WEB-INF/lib
内部JAR的其他
@命名的
bean是可注入的/可以在xhtml文件中使用。因此基本上CDI正在做它的工作,因此检查目录。

一般来说,将EAR与CDI一起使用被认为是最棘手的,最糟糕的是毫无结果。如果您没有使用EAR的严格要求,如果您可以将
核心模块
放入
WEB-INF/lib
中,您将得到预期的结果。

您使用的是什么版本的CDI以及哪个容器?@Templar我使用的是Glassfish 3.1.2.2和Weld 1.1.4.Final。检查此链接:根据JavaEE规范,EJB模块中的类看不到WAR模块中的类。所以,故事到此结束。@BalusC谢谢你提供的信息。你能想出解决这个问题的办法吗基本上,我想用JAR动态扩展我的项目,包括class/resources/xhtml,但也要识别我的扩展。据我所知,以这种方式使用JAR的唯一方法是将它们放在
WEB-INF/lib
中,并管理JAR中
META-INF/resources
下的资源,以便容器找到它们(资源等)。但是仍然存在如何识别当前存在哪个扩展的问题……您是否尝试过将扩展放在EAR/lib中?这个位置在WAR和EJB-JAR中都是可见的。没错,但不幸的是,我还有另外两个WAR的旁白
表示模块
(本例中有两个Web服务),它们也需要
核心模块
。在这种情况下,我必须将它复制到每个
WEB-INF/lib
中,这就不太好了。您可以尝试的另一件事是使用可移植扩展插件将
ApplicationSettings
ModuleCORE
安装到WAR文件的上下文中。