自定义标签库未加载 Liferay7
Custom taglib not loaded with Liferay7
我正在将我的 Liferay portlet 从 6.0 迁移到 Liferay 7.0,我遇到的 许多 障碍之一是包含我的自定义标签库。
我遵循了以下建议: 但是我的 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 的页面(如果主题已经无法访问,这是预料之中的)标签库)
捆绑 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)或添加一些其他配置选项?
好的,我设法自己解决了这个问题。
目录布局需要这样:
+---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.jsp
和 [=20] =]
Import-Package: \
.....
!com.ibm.*,\
!com.sun.*,\
!javax.jmdns.*,\
*
我遇到了同样的问题,并找到了解决方案:只需在您的 "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”。
我正在将我的 Liferay portlet 从 6.0 迁移到 Liferay 7.0,我遇到的 许多 障碍之一是包含我的自定义标签库。
我遵循了以下建议:
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 的页面(如果主题已经无法访问,这是预料之中的)标签库)
捆绑 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)或添加一些其他配置选项?
好的,我设法自己解决了这个问题。
目录布局需要这样:
+---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.jsp
和 [=20] =]
Import-Package: \
.....
!com.ibm.*,\
!com.sun.*,\
!javax.jmdns.*,\
*
我遇到了同样的问题,并找到了解决方案:只需在您的 "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”。