On Wed, Jul 1, 2020 at 6:48 PM Mark Thomas <ma...@apache.org> wrote:

> On 01/07/2020 20:28, Vitor Medina Cruz wrote:
> > On Wed, Jul 1, 2020 at 3:19 PM Mark Thomas <ma...@apache.org> wrote:
> >
> >> On 01/07/2020 18:09, Vitor Medina Cruz wrote:
> >>> On Wed, Jul 1, 2020 at 7:46 AM Mark Thomas <ma...@apache.org> wrote:
> >>>
> >>>> On 30/06/2020 14:19, Vitor Medina Cruz wrote:
> >>>>>  Hello,
> >>>>>
> >>>>> I am trying to configure Tomcat in a way that it makes SCI scan only
> in
> >>>>> jars I explicitly specify to. I followed instructions from
> >>>>> https://tomcat.apache.org/tomcat-8.5-doc/config/jar-scan-filter.htm,
> >> in
> >>>>> both Tomcat 8 and 9, but with no success. I posted a question on
> >>>>> stackoverflow that explains more in detail what I did:
> >>>>>
> >>>>
> >>
> https://stackoverflow.com/questions/62602550/how-to-specify-which-classes-and-jars-gets-scanned-for-servlet-annotations-in-to
> >>>>>
> >>>>> And I also found other unanswered questions pointing to the same
> >> problem,
> >>>>> here is one example:
> >>>>>
> >>>>
> >>
> https://stackoverflow.com/questions/52876216/tomcat-too-slow-scanning-for-annotations
> >>>>> .
> >>>>>
> >>>>> The thing is that it is looking like an error to me because logs
> tells
> >>>> that
> >>>>> scanning is done as configured — if I add a jar for scanning in
> >>>>> JarScanFilter, the log show it is scanned, if I remove it, the log
> stop
> >>>>> reporting it's scanning — but after that, no matter what
> configuration
> >> I
> >>>>> made with JarScanFilter, the WebappServiceLoader loads servlet
> >> annotated
> >>>>> classes, such as @WebListener.
> >>>>
> >>>> The JarScanner machinery handles annotation and TLD scanning.
> >>>>
> >>>> WebappServiceLoader handles SCIs which are handled under the standard
> >>>> service loader mechanism. SCIs can load classes.
> >>>>
> >>>>> Any leads? Ideas? Anyone can confirm if that is an error or if I am
> >> using
> >>>>> the functionality wrongly or if I understand it wrongly.
> >>>>
> >>>> It looks like you aren't preventing the SCIs from being loaded.
> >>>>
> >>>> The specification isn't as clear as it could be here and there are
> still
> >>>> a few gaps. That is being worked on at Eclipse. A useful summary of
> the
> >>>> current position can be found at:
> >>>>
> >>>>
> >>>>
> >>
> https://github.com/apache/tomcat/blob/8.5.x/java/org/apache/catalina/startup/ContextConfig.java#L1092
> >>>>
> >>>> The simplest way to block the Servlet 3 pluggability features is:
> >>>>
> >>>> 1. Add metadata-complete="true" to the web-app element in web.xml
> >>>>    (disables annotation scanning for deploy time annotations -
> >>>>     Servlet 3.1, 8.1)
> >>>>
> >>>> 2. Add <absolute-ordering></absolute-ordering> to web.xml
> >>>>    (disables any SCIs - Servlet 3.1, 8.2.2.d)
> >>>>
> >>>> Mark
> >>>>
> >>>>
> >>> Thanks. I, however, don't want to block all Servlet 3 pluggability as
> >> there
> >>> are frameworks already being made with no way of configuring it other
> >> than
> >>> that....
> >>
> >> You can always explicitly define configuration in web.xml.
> >>
> >>> I would like to selectively choose which jars to be scanned in
> >>> order to avoid performance issues and rogue classes to be loaded. As is
> >>> seems, nor Servlet specification nor Tomcat in specific provides a way
> of
> >>> doing that, is that correct?
> >>
> >> No.
> >>
> >> Scanning != SCI loading.
> >>
> >> Scanning for deployment annotations can be controlled by the JarScanner.
> >>
> >> SCI loading can be controlled by an <absolute-ordering> element that
> >> includes the JARs from which you do want to load SCIs.
> >>
> >>
> > But how can SCI loading takes place without scanning? That was what I
> > thought when I tried to control SCI loads, if I didn't scan any class at
> > all then no SCI should be loaded since no annotations will be found, but
> > that is not the case, so SCI loading must be doing an independent
> scanning
> > on it's own.
>
> No.
>
> SCIs are discovered via the service loader mechanism.
>
> Deployment annotations are discovered via JAR scanning.
>
> These are completely separate mechanisms.
>
> Note that an SCI may load and configure Servlets, Filters, Listeners etc.
>
>
Humm, ok, thanks, I understand now.



> > In any way, leaving behind internal machinery, is it possible to define
> in
> > Tomcat which jars should be considered for annotation processing and SCI
> > loading, and which not?
>
> Yes.
>
> JarScanner for deployment annotations.
>
> <absolute-ordering> for SCIs and @HandlesTypes matches.
>
> > I wanna tell Tomcat to only look and load for
> > @WebFiler, @WebListener, @WebServlet, @HandlesTypes and etc on specific
> > jars. Is that possible?
>
> @WebFiler, @WebListener and @WebServlet are deployment annotations so
> scanning for these is controlled by the JarScanner.
>
> If an SCI has an @HandlesTypes annotation then all JARs that are
> potential SCI sources will be scanned for matches. To put it another
> way, the JarScanner configuration does NOT control the search for
> @HandlesTypes matches. Any JAR eligible to provide an SCI will be
> scanned for @HandlesTypes. Those JARs are controlled by <absolute-ordering>
>

Ok, and if a jar doesn't provide a web-fragment name? In this old post(
http://tomcat.10.x6.nabble.com/Why-does-absolute-ordering-in-web-xml-without-others-kill-classpath-scanning-td5029985.html)
it is said :

"Tomcat will give these a name equal to the name of the JAR file so you can
use it in ordering. That is a Tomcat specific feature."

This is/holds true? I tried with no success

Thanks,
Vitor

>
> Mark
>

Reply via email to