Maven 在WEB-INF/lib内的JAR中找不到CDI实例
我有一个maven JSF项目,其中有几个模块部署到Glassfish 3.1.2.2 结果EAR的结构: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
|-- 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模块
//Module.java
public interface Module {
public String getName();
}
每个模块本身实现接口并返回其名称:
- ModuleCORE.java
- ModuleEXT1.java
- ModuleEXT2.java
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文件的上下文中。