Am 10.05.2017 um 12:18 schrieb Mark Thomas:
On 10/05/17 10:26, Michael Heinen wrote:
Am 10.05.2017 um 00:40 schrieb Mark Thomas:
On 09/05/17 15:25, Michael Heinen wrote:
Hi all,

I am currently mirgating an application from Tomcat 7.0.73 to 8.0.43.
On development platforms we use an embedded tomcat.
On of the jars on the classpath contains a web-fragment.xml in it's
META-INF folder.
This jar file is NOT located within the webApp but simply on the
classpath.
With Tomcat 7.0.73 the web-fragment is processed and the defined filter
is instantiated.
With Tomcat 8.0.43 the web-fragment is not processed at all.

Some lines of code:

final StandardContext ctx = ...
ctx.setXmlBlockExternal(false);

final StandardJarScanner jarScanner = new StandardJarScanner();
jarScanner.setScanAllDirectories(true);
jarScanner.setScanAllFiles(true);
jarScanner.setScanBootstrapClassPath(true);
jarScanner.setScanClassPath(true);
jarScanner.setScanManifest(false);
ctx.setJarScanner(jarScanner);

Should this work with Tomcat 8 or is my expectation wrong?
It should work. I'd recommend putting a break-point in
StandardJarScanner and stepping through the Tomcat code to see what is
going wrong.

Mark
Thanks Mark
Here are the results from debugging:

1) Tomcat 8.0.43:
The boolean parameter "isWebapp" is false in this case and therefore the
web-fragment is not processed at all.
See
org.apache.tomcat.util.descriptor.web.FragmentJarScannerCallback.scan(Jar,
String, boolean)

     // Only web application JARs are checked for web-fragment.xml
     // files.
     // web-fragment.xml files don't need to be parsed if they are never
     // going to be used.
     if (isWebapp && parseRequired) {
         is = jar.getInputStream(FRAGMENT_LOCATION);
     }

2) Tomcat 7.0.73:
There is no check for webApps. The member "parseRequired" is true and
therefore the fragment is loaded.
See
org.apache.catalina.startup.ContextConfig.FragmentJarScannerCallback.scan(JarURLConnection)


  if (parseRequired || context.getXmlValidation()) {
     is = jar.getInputStream(FRAGMENT_LOCATION);
  }
Thanks for digging in to that. That certainly explains the different
behaviours.

Should I open a bug?
Maybe. There might be a (spec related) reason for that. E.g. Something
that was tightened up / clarified in Servlet 3.1 that wasn't back-ported
to Tomcat 7 in case users were relying on the functionality.

The next thing to check is the svn history for those files.
https://svn.apache.org/viewvc/tomcat/ and the annotate (a.k.a blame)
view is useful for that. The key is likely to be the commit that added
the isWebapp test.

Mark

I digged into the history an found following changeset with the comment
"Container provided JARs should not be scanned for deployment annotations nor should they be checked for web-fragment.xml files."
https://svn.apache.org/viewvc?view=revision&revision=1493066
I have no idea how to find the corresponding ticket but a guy called "markt" implemented this ;-)

So the check has been added on purpose but I don't know the reason for that.
What next?

Thanks,
Michael



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




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

Reply via email to