新版本的 JBOSS EAP中,通过“module”机制实现对jar包或者其他资源的管理。
本文不是讲解如何使用系统自带module或者自定义module的。这两点可以参照我之前的博文:
http://rainbow702.iteye.com/blog/2065353
本文主要是对最近遇到的一个问题进行说明。这个问题是关于 primeface.jar 的使用的,现象是primefaces 的 标签不能正常被 渲染(rendered) 的问题。
对于 primefaces 的使用,不管是在官网上找到的sample,还是google出来的sample示例,都需要将 primefaces.jar放置到 APP的 WEB-INF/lib 目录下,这样,在xhtml中使用 "p:"开头的tag时,才会被正确地解析成 primefaces 中对应的tag。
但是,为了提高复用性,不想在每个 工程中都放置一个 primefaces.jar。出于这个目的,我们自然而然的会想到使用 JBOSS 的module 机制。所以,二话不说,将 primefaces.jar做成一个单独的module,然后在 jboss-depolyment-structure.xml 中进行引用:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies><module name="org.primefaces"/></dependencies> </deployment> </jboss-deployment-structure>
按正常的理解,并结合之前的经验(上面给出的那篇贴子),认为这样应该就可以了,画面应该能够正常解析 primefaces 的相关标签了。可是,现实是残酷的。当你去打开包含primefaces相关标签的画面时,你会发现画面不是你想像中的结果。然后你可以通过 右击,查看 页面的源代码,会发现,所有 primefaces相关的标签完全没有被解析,还是原样输出。
鉴于这个效果,我担心会不会上像这种方式失败了,导致了 primefaces 的jar包没有被成功引入啊。不过 通过查看 JBOSS 的server.log,并未发现有异常。后来,我又自己在后台代码中,写了一个方法,在该方法中,调用了 primefaces 中 class org.primefaces.util.AgentUtils 类中的 isIE() 这个方法,然后将判断结果显示到画面上。发现是能够正常显示的。 这就说明 primefaces 的jar包应该被加载到 JVM 中了。
那么,为什么xhtml中的primefaces标签不能被解析呢?
这个时候,我想到会不会是因为 primefaces 的tablig 的 声明 xml 文件没有被parse导致系统不认 primefaces 的标签呢? 于是, google了一下。 我去,还真是。遇到同样问题的人还不少。比如:
https://issues.jboss.org/browse/WFLY-1172
这个是官网方的 issue tracker。 虽然这个问题,目前还是 OPEN 的状态,但是我在其下面的回答中,找到一个提示,就是 “meta-inf='export'”。 抱着试试看的态度,试了一下。哎,我去,还真管用。至此,这个问题解决。至于为什么管用,大家可以去看看 primefaces.jar 中 META-INF 目录下的文件就知道了。(没错,primefaces 的 taglib 的 声明 xml 文件就在其中)。
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies><module name="org.primefaces" export="true" meta-inf="export"/></dependencies> </deployment> </jboss-deployment-structure>
后记: 我觉着本来这个问题并不是一个很难搞定的问题,但是为什么还是花了很多时间去调查才有结果?我觉得一个原因就是,JBOSS 官网没有一个对 jboss-depolyment-structure.xml 这份配置文件的详细说明,以致于我们对这份配置文件可以配置哪些项,这些项又有哪些属性,这些属性又是干嘛用的,都不清楚。 不像 struct.xml 之类的配置,在网上随便一搜就可以搜到大量配置说明。