【发布时间】:2013-12-22 06:29:24
【问题描述】:
我有一个部署到 Glassfish 3.1.2.2 的包含多个模块的 maven JSF 项目。
生成的 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 中存在以下接口:
//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;
}
}
现在的问题是只有核心模块的实现在实例列表中。尽管存在相应的META-INF/beans.xml,但未找到WEB-INF/lib 中模块的实现。
谁能向我解释为什么 CDI 无法找到 Module 接口的所有实例?
旁注:WEB-INF/lib 内的 JAR 中的其他 @Named bean 是可注入的/可以在 xhtml 文件中使用。所以基本上 CDI 正在做它的工作,因此正在检查目录。
【问题讨论】:
-
您使用的是什么版本的 CDI 以及哪个容器?
-
@Templar 我正在使用 Glassfish 3.1.2.2 和 Weld 1.1.4.Final。检查此链接:glassfish.java.net/downloads/3.1.2.2-final.html
-
根据 Java EE 规范,EJB 模块中的类看不到 WAR 模块中的类。所以,故事到此结束。
-
@BalusC 感谢您提供的信息。你能想出什么办法来解决这个问题吗? - 基本上我想用 JAR 动态扩展我的项目,包括 classes/resources/xhtml,但也要识别我的扩展。据我所知,以这种方式使用 JAR 的唯一方法是将它们放在
WEB-INF/lib中并管理 JAR 内META-INF/resources下的资源,以便容器找到它们(资源等)。但是如何识别当前存在的扩展仍然存在问题...... -
您是否尝试将扩展放在 EAR/lib 中?这个位置在 WAR 和 EJB-JAR 中都是可见的。
标签: maven jakarta-ee jsf-2 ejb cdi