【问题标题】:Custom taglib not loaded with Liferay7Liferay7 未加载自定义标记库
【发布时间】:2017-12-01 11:50:31
【问题描述】:

我正在将我的 Liferay portlet 从 6.0 迁移到 Liferay 7.0,我遇到的许多障碍之一是包含我的自定义标记库。

我遵循了来自:Creating a custom taglib in Liferay 7 的建议,但我的 portlet 无法加载 taglib,记录了以下错误:

09:50:48,566 ERROR [http-nio-8080-exec-10][FreeMarkerManager:208] Unable to add taglib my_tags to context
FreeMarker template error:
freemarker.template.TemplateModelException: Error while loading tag library for URI "/META-INF/my_tags.tld" from TLD location "servletContext:/META-INF/my_tags.tld"; see cause exception.
        at freemarker.ext.jsp.TaglibFactory.get(TaglibFactory.java:260)
        at com.liferay.portal.template.freemarker.internal.FreeMarkerManager$TaglibFactoryWrapper.get(FreeMarkerManager.java:647)
        at com.liferay.portal.template.freemarker.internal.FreeMarkerManager.addTaglibSupport(FreeMarkerManager.java:205)
        at com.liferay.taglib.util.ThemeUtil.doIncludeFTL(ThemeUtil.java:276)
        at com.liferay.taglib.util.ThemeUtil.doDispatch(ThemeUtil.java:157)
        at com.liferay.taglib.util.ThemeUtil.includeFTL(ThemeUtil.java:100)
        at com.liferay.taglib.util.ThemeUtil.include(ThemeUtil.java:82)

但是,我的包 JAR确实包含 META-INF/my_tags.tld

让我印象深刻的是,当我的 JSP 被加载但在主题的 FreeMarker 模板中的某个地方时,错误不会发生。显然那时我的 JSP 甚至还没有加载。

在我的门户中的 每个 页面上都会引发错误,而不仅仅是那些包含我的 portlet 的页面(如果主题已经无法访问 taglib,这是可以预期的)

bundle JAR的结构是:

com/
content/  
META-INF/
   +--- resources/
   MANIFEST.MF
   taglib-mappings.properties
   my_tags.tld
OSGI-INF/
WEB-INF/         

bnd 任务生成的 MANIFEST.MF 包含以下依赖:

Require-Capability: osgi.extender;osgi.extender="jsp.taglib";uri="/META-INF/my_tags.tld"

文件taglib-mappings.properties 包含:

my_tags=/META-INF/my_tags.tld 

我还尝试将 .tld 文件放入 WEB-INF/tld 中,以使用普通、简单、标准的 portlet 或 Web 应用程序,但也无济于事。

我是否需要在web.xml 中添加映射(我不确定新的 OSGi portlet 是否甚至使用 web.xml)或添加一些其他配置选项?

【问题讨论】:

    标签: jsp osgi portlet taglib liferay-7


    【解决方案1】:

    我遇到了同样的问题,并找到了解决方案:只需在“liferay-plugin-package.properties”文件中添加即可

    Provide-Capability=osgi.extender;osgi.extender="jsp.taglib";uri="/META-INF/my-tags.tld"
    

    请注意,您也可以将 tld 文件保存在“/WEB-INF/tld”中 - 并将配置文件中的“/META-INF”更改为“/WEB-INF/tld”。

    【讨论】:

      【解决方案2】:

      好的,我自己设法解决了这个问题。

      目录布局需要是这样的:

      +---java
      |   \---com
      |       \---mypackage
      |           |   
      |           +---portlet
      |           |       MyPortlet.java
      |           |       
      |           \---tags
      |                   LabelTag.java
      |                   
      \---resources
          +---content
          |       Language.properties
          |       
          +---META-INF
          |   |   my_tags.tld
          |   |   
          |   \---resources
          |       |   view.jsp
          |               
          \---WEB-INF
      

      与网上的一些提示不同,文件taglib-mappings.properties 是不需要的。如果存在,Liferay 会抛出大量异常,因为 Freemarker 引擎会尝试访问在 taglib-mappings.properties 中引用的标记库。

      my_tags.tld 包含以下内容:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
      
      <taglib>
        <tlib-version>1.0</tlib-version>
        <jsp-version>1.1</jsp-version>
        <short-name>ka</short-name>
        <uri>http://example.com/tld/my_tags</uri>
      
        <tag>
          <name>label</name>
          <tag-class>com.mypackage.tags.LabelTag</tag-class>
          <body-content>scriptless</body-content>
          <attribute>
            <name>labelText</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.String</type>
          </attribute>
        </tag>
      </taglib>
      

      在JSP页面中,标签定义为:

      <%@ taglib uri="http://example.com/tld/my_tags" prefix="my" %>
      

      我确实在 OSGI MANIFEST.MF 文件中为我自己的标签包含 Require-Capability:

      我只包括标准 JSTL 和 Liferay 标签:

      Require-Capability: osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(
       uri=http://java.sun.com/portlet_2_0))",osgi.extender;filter:="(&(osgi.e
       xtender=jsp.taglib)(uri=http://liferay.com/tld/aui))",osgi.extender;fil
       ter:="(&(osgi.extender=jsp.taglib)(uri=http://liferay.com/tld/portlet))
       ",osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(uri=http://lifera
       y.com/tld/theme))",osgi.extender;filter:="(&(osgi.extender=jsp.taglib)(
       uri=http://liferay.com/tld/ui))",osgi.ee;filter:="(&(osgi.ee=JavaSE)(ve
       rsion=1.8))"
      

      但是,我确实需要排除 OSGI bnd.bnd 文件中的一些包,因为它们依赖于javax.servlet.jspjstl

      Import-Package: \
          .....
          !com.ibm.*,\
          !com.sun.*,\
          !javax.jmdns.*,\
          * 
      

      【讨论】:

        猜你喜欢
        • 2016-07-08
        • 1970-01-01
        • 2015-06-03
        • 2014-12-14
        • 1970-01-01
        • 2019-12-30
        • 2016-02-25
        • 2018-05-21
        • 1970-01-01
        相关资源
        最近更新 更多