JAR 中的 JSF 复合组件在 NetBeans 中无法识别

Posted

技术标签:

【中文标题】JAR 中的 JSF 复合组件在 NetBeans 中无法识别【英文标题】:JSF composite components in JAR not recognised in NetBeans 【发布时间】:2014-03-03 15:49:00 【问题描述】:

我在我的项目中添加了一个通用 JAR。这个罐子看起来像......

CommonWeb.jar
 |-- META-INF
 |    |-- resources
 |    |    `-- common
 |    |         |-- css
 |    |         |    `-- my.css
 |    |         |-- js
 |    |         |    `-- my.js
 |    |         |-- images
 |    |         |    `-- my.png
 |    |         |-- components
 |    |         |    `-- mycomposite.xhtml
 |    |         `-- templates
 |    |              `-- mytemplate.xhtml
 |    |-- faces-config.xml
 |    `-- MANIFEST.MF
 :

一切正常,只是 Netbeans 无法识别我的复合组件。尝试使用该组件的页面看起来像这样......

<ui:composition template="/resources/common/templates/mytemplate.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://primefaces.org/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:cmn="http://java.sun.com/jsf/composite/common/components">

    <ui:define name="content">
        ...
        <cmn:mycomposite ... />
        ...
    </ui:define>
</ui:composition>

项目会编译运行,不用担心。但是 IDE 在 &lt;cmn:mycomposite ... /&gt; 上给了我红色的波浪线,并且不会自动完成等。如果我将组件复制到项目自己的资源文件夹中,一切都会正常工作,所以看起来 netbeans 只是不看 jar .

有很多类似问题的问题,例如:

JSF Composite Component into JAR in NetBeans JSF Composite Component Netbeans Composite components in an external JAR are not recognized in Netbeans

...但是没有令人满意的解决方案或变通方法。

还有一些关于此事的 netbeans 错误报告,但这些似乎都已“修复”

我缺少一些配置吗?有没有人真正设法使用最新版本的 NetBeans(撰写本文时为 NetBeans 7.4 Patch 2)来实现这一点?有没有人找到真正有效的解决方法?

更新:

此问题在 NetBeans 8 中继续出现

【问题讨论】:

我不做Netbeans,所以我现在不能自己尝试写一个可靠的答案。我只能建议自己尝试一件事:创建一个/META-INF/foo.taglib.xml,其中根据此问答明确声明 JAR 中包含的复合组件的新命名空间:***.com/questions/22247914/… 然后,尝试在 Netbeans 中使用新的 XML 命名空间。至少,这是通常的“组件库”应该如何工作的,我很难想象 Netbeans 也不会考虑到它们。 @BalusC 在*.taglib.xml 中声明namespacecomposite-library-name 并不能解决问题。 为了确定,taglib 在 JAR 中(不在 WAR 中),并且您确实将使用页面中的 XML 命名空间更改为 taglib 中声明的命名空间? 是的,这里一切都很好。此外,项目编译和运行没有任何问题,只是恼人的问题是 NetBeans 无法识别复合组件,从而将页面标记为错误。当taglib.xml中显式定义了一些标签时,NetBeans也没有问题,问题只是与组合组件有关,在*.taglib.xml中没有显式定义,而是通过&lt;composite-libraray-name&gt;的用法定义 问题在 Netbeans 8.1 中继续存在 netbeans.org/bugzilla/show_bug.cgi?id=257684 【参考方案1】:

此问题仅是 IDE 问题,并在 8.1 版中继续存在。它源于Netbeans bugzilla 中确定的错误 - 特别是在“用于 XHTML 的 JSF 编辑器”模块 (org.netbeans.modules.web.jsf.editor) 中

我通过下载 Netbeans 的 8.1 版源文件并自己应用建议的补丁解决了这个问题。我猜这是早期版本中的类似问题,但我没有检查。

要下载和编译 Netbeans,您可以按照 here 中的“操作方法”进行操作

变化总结:

CompositeComponentModel.java 第 296 行更改为:

if (parent != null && parent.getName().equalsIgnoreCase("META-INF"))  //NOI18N

JsfBinaryIndexer.java 第 74 行更改为:

namePattern = ".*\\.tld|.*\\.taglib\\.xml|.*\\.xhtml",

第 81 行递增的索引器版本更改为:

static final int INDEXER_VERSION = 11; //NOI18N

鉴于该错误正在被跟踪,希望它能够进入下一个版本。

【讨论】:

以上是关于JAR 中的 JSF 复合组件在 NetBeans 中无法识别的主要内容,如果未能解决你的问题,请参考以下文章

如何对 jsf 复合组件中的集合属性进行 bean 验证,约束不会触发

将 JavaScript 集成到 JSF 复合组件中,干净的方式

JSF2.0 - 具有可选方法表达式的复合组件

jsf 2.0 自定义组件/标签不复合

如何在 JSF 2 中以编程方式或动态创建复合组件

导致堆栈溢出异常的嵌套 JSF 复合组件