提供相同渲染器的两个 JSF 库
Two JSF libraries providing the same renderer
短版:
如果两个 JSF 库 jar 文件都包含同一系列和类型的自定义呈现器,是否有任何方法可以从库本身(即不是来自包含的应用程序)中指定应该使用哪一个?比如分配优先级,高优先级优先于低优先级?
加长版:
我在项目中使用 Primefaces 并尝试用我自己的头部渲染器覆盖提供的头部渲染器:
<render-kit>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Head</renderer-type>
<renderer-class>com.example.MyHeadRenderer</renderer-class>
</renderer>
</render-kit>
如果我将它放入 war 文件的 WEB-INF/faces-config.xml
中,那么一切都很好,并且我的渲染器被使用了。
但是,如果我尝试将我的代码部署为库 jar (my-utils.jar) 的一部分,并使用 META-INF/faces-config.xml
中定义的渲染器,则会使用 Primefaces。这包含完全相同的定义,所以我猜它只是取决于它们加载的顺序。事实上,将我的库重命名为 "xx-comps.jar" 是可行的,因此看起来 JSF 正在按字母顺序从所有 jar 文件中加载 faces-config.xml
文件,后面的条目只是覆盖前面的条目。
有什么方法可以强制选择我的图书馆吗?
到目前为止,我有以下选择:
- 将我的渲染器直接放入war的
WEB-INF/faces-config.xml
。
- 使用该渲染器定义构建自定义 Primefaces jar
已删除。
- 重命名我的库并依赖一些(尽可能未记录
参见)JSF 加载器的行为。
- 添加一个扩展标准的自定义renderkit,并参考
来自我的 war
WEB-INF/faces-config.xml
.
前三个都可以,但并不理想,因为 (1) 和 (2) 需要在我的库之外进行更改,而 (3) 看起来很狡猾....
第四个只是一个想法,因为我以前从未编写过渲染工具包,所以不涉及war所涉及的工作。不知道它是否实用或可行,但它比 (1) 更好,因为至少应用程序仅引用单个渲染套件,并且不需要更新 if/when 添加了新的渲染器。如果它看起来是一个合理的解决方案,很高兴投入更多精力研究这种方法。
此外,我更喜欢使用注释而不是 XML:
@FacesRenderer(componentFamily = "javax.faces.Output", rendererType = "javax.faces.Head")
public class MyHeadRenderer extends Renderer {
...
}
谢谢
您可以通过 JAR 的 faces-config.xml
中的 <ordering>
指定顺序。
例如如果你想让你的实用程序库在所有其他程序库之后加载,那么就这样做:
<ordering>
<after>
<others />
</after>
</ordering>
如果你想强制一个显式排序,那么挂钩特定的 PrimeFaces,它在其 faces-config.xml
:
中有一个 <name>primefaces</name>
<ordering>
<after>
<name>primefaces</name>
</after>
</ordering>
短版:
如果两个 JSF 库 jar 文件都包含同一系列和类型的自定义呈现器,是否有任何方法可以从库本身(即不是来自包含的应用程序)中指定应该使用哪一个?比如分配优先级,高优先级优先于低优先级?
加长版:
我在项目中使用 Primefaces 并尝试用我自己的头部渲染器覆盖提供的头部渲染器:
<render-kit>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Head</renderer-type>
<renderer-class>com.example.MyHeadRenderer</renderer-class>
</renderer>
</render-kit>
如果我将它放入 war 文件的 WEB-INF/faces-config.xml
中,那么一切都很好,并且我的渲染器被使用了。
但是,如果我尝试将我的代码部署为库 jar (my-utils.jar) 的一部分,并使用 META-INF/faces-config.xml
中定义的渲染器,则会使用 Primefaces。这包含完全相同的定义,所以我猜它只是取决于它们加载的顺序。事实上,将我的库重命名为 "xx-comps.jar" 是可行的,因此看起来 JSF 正在按字母顺序从所有 jar 文件中加载 faces-config.xml
文件,后面的条目只是覆盖前面的条目。
有什么方法可以强制选择我的图书馆吗?
到目前为止,我有以下选择:
- 将我的渲染器直接放入war的
WEB-INF/faces-config.xml
。 - 使用该渲染器定义构建自定义 Primefaces jar 已删除。
- 重命名我的库并依赖一些(尽可能未记录 参见)JSF 加载器的行为。
- 添加一个扩展标准的自定义renderkit,并参考
来自我的 war
WEB-INF/faces-config.xml
.
前三个都可以,但并不理想,因为 (1) 和 (2) 需要在我的库之外进行更改,而 (3) 看起来很狡猾....
第四个只是一个想法,因为我以前从未编写过渲染工具包,所以不涉及war所涉及的工作。不知道它是否实用或可行,但它比 (1) 更好,因为至少应用程序仅引用单个渲染套件,并且不需要更新 if/when 添加了新的渲染器。如果它看起来是一个合理的解决方案,很高兴投入更多精力研究这种方法。
此外,我更喜欢使用注释而不是 XML:
@FacesRenderer(componentFamily = "javax.faces.Output", rendererType = "javax.faces.Head")
public class MyHeadRenderer extends Renderer {
...
}
谢谢
您可以通过 JAR 的 faces-config.xml
中的 <ordering>
指定顺序。
例如如果你想让你的实用程序库在所有其他程序库之后加载,那么就这样做:
<ordering>
<after>
<others />
</after>
</ordering>
如果你想强制一个显式排序,那么挂钩特定的 PrimeFaces,它在其 faces-config.xml
:
<name>primefaces</name>
<ordering>
<after>
<name>primefaces</name>
</after>
</ordering>