自定义taglib未加载Liferay7

时间:2017-06-28 08:10:18

标签: jsp osgi portlet taglib liferay-7

我正在将Liferay portlet从6.0迁移到Liferay 7.0,其中一个很多包版我正在使用我自定义的taglib。

我遵循了以下建议: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,那就会出现错误)

捆绑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)或添加其他配置选项?

2 个答案:

答案 0 :(得分:5)

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

目录布局必须如下:

+---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中引用的taglib。

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))"

但是,由于依赖于javax.servlet.jspjstl

,我确实需要排除 OSGI bnd.bnd文件中包含的一些软件包
Import-Package: \
    .....
    !com.ibm.*,\
    !com.sun.*,\
    !javax.jmdns.*,\
    * 

答案 1 :(得分:0)

我遇到了同样的问题,并找到了解决方案:只需在您的“ 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”。