我有一个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
我有三个模块:
EJB模块中存在以下接口:
//Module.java
public interface Module {
public String getName();
}
每个模块本身都实现了接口并返回其名称:
在核心模块中,有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正在完成其工作,因此正在检查目录。
答案 0 :(得分:1)
一般来说,使用带有CDI的EAR一直被认为是棘手的,更糟糕的是没有结果。如果您没有强烈要求使用EAR,如果您可以将core-module
放入WEB-INF/lib
,那么您最终会得到预期的结果。