由于您使用的是您提到的技术堆栈,因此也可以选择 CDI。无论如何,如果您将所有内容都打包为 WAR,那么这只是运行时的一个模块。假设您有以下结构:
--- WAR
|--- any *.xhtml files can live here (public)
|--- WEB-INF
|--- web.xml (optional)
|--- persistence.xml (optional) - declare persistence unit used from WEB-INF/classes
|--- beans.xml (optional) enable CDI annotation scanning for WEB-INF/classes
|--- faces-config.xml (optional) enable JSF annotation scanning in WEB-INF/classes
|--- *.xhtml files can live here (private - usually templates, ui:composition, etc.)
|--- classes
|--- com.example - put managed beans here, EJBs, JPA etities or just about any other *.class
|---lib
|--- jpa.jar
|--- META-INF
|--- persistence.xml - persistence unit used in this jar
|--- com.example - JPA entities can live here, gets mapped to WEB-INF/classes at runtime
|--- ejb.jar
|--- META-INF
|--- ejb-jar.xml (optional) but can declare resources here
|--- com.example - ejbs can live here, gets mapped to /WEB-INF/classes at runtime
|--- faces.jar
|--- META-INF
|--- faces-config.xml - enables scanning JSF specific annotations in this jar
|--- resources - this gets mapped to the WAR root at runtime, .xhtml can live here
|--- com.example - put your @ManagedBean s here and @EJB inject anything from ejb.jar, gets mapped to /WEB-INF/classes at runtime
|--- cdi.jar
|--- META-INF
|--- beans.xml - marks this as CDI bean archive
|--- com.example - CDI beans can live here, gets mapped to WEB-INF/classes at runtime
请注意,即使我在上面的结构中专门分离了 jpa.jar、ejb.jar、faces.jar 和 CDI.jar,也没有说你必须这样做——你可以随意混合和匹配。要点:
- 对于 WAR 类中的任何 jar ,在运行时
WEB-INF/lib
都会映射到/WEB-INF/classes
beans.xml
启用 CDI
faces-config.xml
启用 JSF 注释扫描
ejb-jar.xml
在任何地方都不需要,但您可以利用它
web.xml
可以住WEB-INF/
,但不是必须的
web-fragment.xml
可以存在于其中META-INF
任何 jar 的文件夹中WEB-INF/lib
并合并到web.xml
.xhtml
JSF 文件可以存在于WEB-INF/
(私有)内的 Web 应用程序根目录(公共)和META-INF/resources
任何 jar 内- 所有这些文件都被映射到 Web 应用程序根目录(即,如果它们在 jar 中,WEB-INF/lib
它们可以在逻辑上最终在其中)WEB-INF/
META-INF/resource/WEB-INF
persistence.xml
可以住在里面的任何罐子里WEB-INF
或里面META-INF
WEB-INF/lib
这应该只是覆盖它 - 让我知道是否有任何不清楚或可以添加。