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

时间:2013-12-05 10:48:21

标签: maven java-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 (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

在核心模块中,有listModules.xhtml引用的以下bean以显示模块列表:

//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;
    }
}

现在问题是只有core-Module的实现在Instances列表中。虽然存在相应的WEB-INF/lib,但找不到META-INF/beans.xml内的模块的实现。

有人可以向我解释为什么CDI无法找到Module界面的所有实例吗?

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

1 个答案:

答案 0 :(得分:1)

一般来说,使用带有CDI的EAR一直被认为是棘手的,更糟糕​​的是没有结果。如果您没有强烈要求使用EAR,如果您可以将core-module放入WEB-INF/lib,那么您最终会得到预期的结果。