2017-06-28 18 views
8

Tôi đang di chuyển các porter Liferay của mình từ 6.0 lên Liferay 7.0 và một trong số nhiều rào chắn mà tôi đang nhấn là đưa thẻ tag tùy chỉnh của mình vào.Taglib tùy chỉnh không được nạp với Liferay7

Tôi làm theo các lời khuyên từ: Creating a custom taglib in Liferay 7 nhưng portlet của tôi thất bại trong việc tải các taglib, lỗi sau đây được đăng:

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) 

Tuy nhiên, bó của tôi JAR không chứa META-INF/my_tags.tld

gì đập vào mắt tôi , là lỗi không xảy ra khi JSP của tôi được tải nhưng một nơi nào đó bên trong khuôn mẫu FreeMarker của chủ đề. Rõ ràng JSP của tôi thậm chí không được nạp vào thời điểm đó.

Các lỗi được ném vào mỗi trang trong cổng thông tin của tôi, không chỉ những người có chứa portlet của tôi (s) (mà là để được mong đợi nếu các chủ đề đã thất bại trong việc truy cập vào taglib)

Cấu trúc của gói JAR là:

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

các MANIFEST.MF được tạo ra bởi các nhiệm vụ BND chứa phụ thuộc sau:

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

Các tập tin taglib-mappings.properties chứa:

my_tags=/META-INF/my_tags.tld 

Tôi cũng đã cố gắng đưa các tập tin .TLD vào WEB-INF/tld nơi mà nó sẽ ở cùng với một đơn giản, đơn giản, tiêu chuẩn portlet hoặc web ứng dụng, nhưng không có kết quả trong hai.

Tôi có cần phải thêm ánh xạ trong web.xml (Tôi không chắc liệu các portlet OSGi mới có sử dụng web.xml) hoặc thêm một số tùy chọn cấu hình khác không?

Trả lời

5

OK, tôi đã tự mình tìm ra điều này.

bố trí

Thư mục cần phải được như thế này:

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

Ngược lại với một số gợi ý trên mạng Internet, các tập tin taglib-mappings.properties là không cần thiết. Nếu nó hiện diện, Liferay sẽ ném một tỷ lệ ngoại lệ vì công cụ Freemarker cố truy cập các thẻ tag được tham chiếu trong taglib-mappings.properties.

my_tags.tld chứa sau:

<?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> 

Các trong trang JSP, thẻ được định nghĩa là:

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

tôi làm không bao gồm Require-Capability: cho thẻ của riêng tôi trong Tệp OSGI MANIFEST.MF.

tôi chỉ bao gồm rằng đối với JSTL tiêu chuẩn và thẻ 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))" 

Tuy nhiên, tôi đã cần phải loại trừ một số gói trong file OSGi bnd.bnd được bao gồm do sự phụ thuộc vào javax.servlet.jspjstl

Import-Package: \ 
    ..... 
    !com.ibm.*,\ 
    !com.sun.*,\ 
    !javax.jmdns.*,\ 
    * 
Các vấn đề liên quan