具有共享代码的多个 JSF 项目的结构

Posted

技术标签:

【中文标题】具有共享代码的多个 JSF 项目的结构【英文标题】:Structure for multiple JSF projects with shared code 【发布时间】:2012-01-09 08:48:06 【问题描述】:

我有两个共享大量代码的 JSF 项目 - java 类、xhtml 文件、标签库、css 和 javascript 文件等。我的开发环境/平台主要由 Eclipse、Ant、Perforce 和 Tomcat 组成。

有没有人找到一种方法来创建和组织共享代码,以便公共代码可以保留在一组文件夹中?

Eclipse 可以很容易地为 java 源添加外部文件夹,但在其他文件类型方面存在不足。我会很感激任何想法。

【问题讨论】:

【参考方案1】:

在 Eclipse 中创建一个新的“Java 项目”。将其作为另一个项目添加到主动态 Web 项目的 Deployment Assembly 属性中。这样,它将自动以 JAR 的形式出现在 Web 项目构建的/WEB-INF/lib 中。由于较新的 Eclipse 版本,您还可以将项目创建为“Web Fragment Project”。这样部署组装步骤将自动完成。

将所有这些共享资源文件放在Java 项目的/META-INF/resources 文件夹中。只需将其视为主 Web 项目的 WebContent/resources 即可。标记文件可以保存在它们自己的/META-INF/tags 文件夹中。

例如

CommonWebProject
 |-- META-INF
 |    |-- resources
 |    |    `-- common
 |    |         |-- css
 |    |         |    `-- some.css
 |    |         |-- js
 |    |         |    `-- some.js
 |    |         |-- images
 |    |         |    `-- some.png
 |    |         |-- components
 |    |         |    `-- somecomposite.xhtml
 |    |         `-- sometemplate.xhtml
 |    |-- tags
 |    |    `-- sometag.xhtml
 |    |-- beans.xml
 |    |-- faces-config.xml
 |    |-- some.taglib.xml
 |    |-- web-fragment.xml
 |    `-- MANIFEST.MF
 :

<h:outputStylesheet library="common" name="css/some.css" />
<h:outputScript library="common" name="js/some.js" />
<h:graphicImage library="common" name="images/some.png" />
<common:somecomposite />
<common:sometag />
<ui:include src="/common/sometemplate.xhtml" />
...

如果您使用 Maven,/META-INF 文件夹必须放在 src/main/resources 中,因此不是 src/main/java

如果您还想触发 JSF 注释扫描器,以便您可以将 @FacesValidator@FacesConverter@FacesComponent@FacesRenderer 和 consorts 也放入该项目中,那么创建一个 /META-INF/faces-config.xml 文件为好吧。下面是一个兼容 JSF 2.3 的:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
    version="2.3">
    <!-- Put shared faces-config.xml config here. -->
</faces-config>

/META-INF/web-fragment.xml 是 JAR 被 servletcontainer 识别为“Web 片段项目”所必需的,并且应该已经由您的 IDE 生成,但为了完整起见,这里是 Servlet 4.0 的样子兼容的:

<?xml version="1.0" encoding="utf-8"?>
<web-fragment
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-fragment_4_0.xsd"
    version="4.0">
    <!-- Put shared web.xml config here. -->
</web-fragment>

就是这样。

另见:

Splitting up shared code and web.xml from WAR project to common JAR project JSF facelets template packaging Obtaining Facelets templates/files from an external filesystem or database

【讨论】:

非常感谢!我也很荣幸您的回复多次访问您的博客,讨论许多 JSF 问题! @Heizenberg,如果他有帮助,请将回复标记为答案并通过单击侧面的向上箭头对其进行投票。它是表示感谢的堆栈交换方式:) 谢谢弗雷德里克。我用“打勾”标记将其标记为答案。我现在需要“建立声望”,这样我才能投票(需要“15 声望”才能投票) @BalusC:如果我使用的是 JSF 1.2,这会有所不同吗? 是的。您需要实现一个 facelets 资源解析器:***.com/questions/5587808/…。但是由于您提到“xhtml”并且 JSF 1.2 退出了 2 年,所以我自动假设 JSF 2.0 ... 那么,您使用的是 JSF 1.2?对不起,我的错,我不应该假设 JSF 2.0。有机会升级吗?这可能会有所帮助:***.com/questions/4441713/…

以上是关于具有共享代码的多个 JSF 项目的结构的主要内容,如果未能解决你的问题,请参考以下文章

如何为具有共享代码库的多个项目正确设置 git?

部署 JSF 复合组件以供共享使用

如何在多个战争之间共享一个jsf错误页面

如何使用 angularJS 在多个项目之间共享代码

在多个 Xcode+PhoneGap 项目之间共享代码

项目之间的 Javascript IIFE 代码共享