如何控制多个JSF库JAR文件的加载顺序

问题描述 投票:0回答:1

简短版本

如果两个 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
文件,后面的条目只会覆盖前面的条目。

有什么方法可以强制选择我的图书馆吗?

到目前为止,我有以下选择:

  1. 将我的渲染器直接放入战争的
    WEB-INF/faces-config.xml
  2. 使用该渲染器定义构建自定义 Primefaces jar 已删除。
  3. 重命名我的库并依赖一些库(尽可能未记录) 请参阅)来自 JSF 加载器的行为。
  4. 添加一个扩展标准渲染套件的自定义渲染套件,并参考 来自我的战争
    WEB-INF/faces-config.xml

前三个都可以工作,但并不理想,因为(1)和(2)需要在我的库之外进行更改,而(3)看起来很危险......

第四个只是一个想法,因为我以前从未编写过渲染工具包,所以不知道所涉及的工作。不知道它是否实用或有效,但它比(1)更好,因为至少应用程序仅引用单个渲染套件,并且如果/当添加新渲染器时不需要更新。如果它看起来是一个合理的解决方案,很乐意投入更多精力来研究这种方法。

此外,理想情况下我更喜欢使用注释而不是 XML:

@FacesRenderer(componentFamily = "javax.faces.Output", rendererType = "javax.faces.Head")
public class MyHeadRenderer extends Renderer {
  ...
}

谢谢

jsf loading faces-config
1个回答
4
投票

您可以通过 JAR 的

<ordering>
中的
faces-config.xml
指定顺序。

例如如果您希望您的实用程序库在所有其他库之后加载,那么就这样做:

<ordering>
    <after>
        <others />
    </after>
</ordering>

如果您想强制执行显式排序,请专门连接 PrimeFaces,它的

<name>primefaces</name>
中有一个
faces-config.xml

<ordering>
    <after>
        <name>primefaces</name>
    </after>
</ordering>
© www.soinside.com 2019 - 2024. All rights reserved.