Re: TLD files packaged in JAR required to be under META-INF/resources?

2018-05-30 Thread Jeremy Boynes
> On May 30, 2018, at 3:13 AM, Tomas Hofman  wrote:
> 
> Hello,
> 
> I run into something that looks like non spec-conforming behavior and would 
> like to check with you if it's really a bug or I'm having incorrect 
> expectations.
> 
> I have TLD located in JAR under META-INF/tlds/hi.tld. The JAR also contains 
> web-fragment.xml with taglib mapping like this:
> 
>  
>
>
>/HiTag
>/tlds/hi.tld
>
>
>  
> 
> This JAR is loaded in a WAR, that contains JSP with following directive:
> 
>  <%@ taglib uri="/HiTag" prefix="say"%>
> 
> During deployment in apache-tomcat-9.0.8 I see this warning:
> 
> 30-May-2018 10:38:42.240 WARNING 
> [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 
> org.apache.jasper.servlet.TldScanner.scanJspConfig Failed to process TLD with 
> path [/tlds/hi.tld] and URI [/HiTag]. The specified path does not exist.
> 
> and the jsp compilation fails.
> 
> When I move the TLD under META-INF/resources, then it starts to work.
> When I use implicit mapping by defining  element in hi.tld instead of 
> explicit mapping in web-fragment.xml, that works too.
> 
> The JSP spec says that TLDs must be in META-INF/ or subdirectories:
> 
> [quote]
> JSP 7.3.1
> 
> When deployed inside a JAR file, the tag library descriptor files must be in 
> the META-INF directory, or a subdirectory of it.
> [/quote]
> 
> I think it's caused by this line in TldScanner.java:
> 
> https://github.com/apache/tomcat/blob/TOMCAT_8_0_0_RC10/java/org/apache/jasper/servlet/TldScanner.java#L177
> 
> where ServletContext#getResource() would naturally see only files under 
> META-INF/resources/ dir.
> 
> Thanks for any opinions!

This may be better addressed to user@t.a.o as this really relates to the Jasper 
JSP engine rather than the taglib itself. Having said that, here’s how I read 
the spec.

JSP 7.3.3 talks about a “taglib map” using elements in the deployment 
descriptor per your example. Per JSP 7.3.2 the URI is mapped to a _context 
relative path_ interpreted relative to the root of the web application. 
Resources contained in a web fragment jar are located in its 
/META-INF/resources directory. Tomcat/Jasper are synthesizing the effective web 
application from the resources in the fragments, then resolving the URI in the 
taglib map against that merged application. I think that’s a correct 
interpretation of the spec.

JSP 7.3.1 refers to implicit map entries found by scanning the web 
application’s jars from WEB-INF/lib

--
Jeremy


-
To unsubscribe, e-mail: taglibs-user-unsubscr...@tomcat.apache.org
For additional commands, e-mail: taglibs-user-h...@tomcat.apache.org



TLD files packaged in JAR required to be under META-INF/resources?

2018-05-30 Thread Tomas Hofman

Hello,

I run into something that looks like non spec-conforming behavior and would 
like to check with you if it's really a bug or I'm having incorrect expectations.


I have TLD located in JAR under META-INF/tlds/hi.tld. The JAR also contains 
web-fragment.xml with taglib mapping like this:


  


/HiTag
/tlds/hi.tld


  

This JAR is loaded in a WAR, that contains JSP with following directive:

  <%@ taglib uri="/HiTag" prefix="say"%>

During deployment in apache-tomcat-9.0.8 I see this warning:

30-May-2018 10:38:42.240 WARNING 
[ContainerBackgroundProcessor[StandardEngine[Catalina]]] 
org.apache.jasper.servlet.TldScanner.scanJspConfig Failed to process TLD with 
path [/tlds/hi.tld] and URI [/HiTag]. The specified path does not exist.


and the jsp compilation fails.

When I move the TLD under META-INF/resources, then it starts to work.
When I use implicit mapping by defining  element in hi.tld instead of 
explicit mapping in web-fragment.xml, that works too.


The JSP spec says that TLDs must be in META-INF/ or subdirectories:

[quote]
JSP 7.3.1

When deployed inside a JAR file, the tag library descriptor files must be in 
the META-INF directory, or a subdirectory of it.

[/quote]

I think it's caused by this line in TldScanner.java:

https://github.com/apache/tomcat/blob/TOMCAT_8_0_0_RC10/java/org/apache/jasper/servlet/TldScanner.java#L177

where ServletContext#getResource() would naturally see only files under 
META-INF/resources/ dir.


Thanks for any opinions!

--
Tomas Hofman
Software Engineer, JBoss SET
Red Hat

-
To unsubscribe, e-mail: taglibs-user-unsubscr...@tomcat.apache.org
For additional commands, e-mail: taglibs-user-h...@tomcat.apache.org