You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Vernat Emeric <ev...@free.fr> on 2019/01/06 03:02:23 UTC

Feature? jdbc driver vs javamail loading from WEB-INF/lib

Hello,

Is the jdbc driver loading from WEB-INF/lib and used in jndi datasource 
an official feature, given that it is used in so many webapps? Then what 
about mail session and javamail?

Before saying yes of course or never it is, see that the jdbc driver is 
loaded from WEB-INF/lib and used in a jndi datasource declared in 
context.xml, with the source of a basic webapp 
(https://github.com/evernat/jdbcDatasourceVsMailSession) :

 1. Either run |mvn tomcat7:run|
 2. Open http://localhost:8080/jdbc.jsp

or

 1. Run |mvn package| then deploy target/test-0.1.war in Tomcat 9 or
    Tomcat 8 or in most versions of Tomcat 7
 2. Open http://localhost:8080/test-0.1/jdbc.jsp and see "JDBC
    connection OK".

And note that this quite well known Tomcat's feature since some version 
of Tomcat long ago seems to me the opposite of what says the Tomcat's 
doc, 
https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html#DriverManager,_the_service_provider_mechanism_and_memory_leaks:

    Drivers packaged in web applications (in WEB-INF/lib) and in the
    shared class loader (where configured) will not be visible and will
    not be loaded automatically. If you are considering disabling this
    feature, note that the scan would be triggered by the first web
    application that is using JDBC, leading to failures when this web
    application is reloaded and for other web applications that rely on
    this feature.

    Thus, the web applications that have database drivers in their
    WEB-INF/lib directory cannot rely on the service provider mechanism
    and should register the drivers explicitly.

And perhaps some version of the JRE Memory Leak Prevention Listener 
introduced by accident this feature of loading from WEB-INF/lib which is 
used by so many webapps now. Users don't think anymore that it is an 
accident and they think that it is a feature which makes their webapps' 
deployment autonomous.


You have seen that the jdbc driver is loaded from WEB-INF/lib and used 
in a jndi datasource declared in context.xml. Now, a jndi mail session 
is the second thing declared in context.xml next to the datasource, to 
configure smtp server like the database server for the datasource. Is 
the javamail driver loaded from WEB-INF/lib and used in a jndi mail session?

But see that the javamail driver is not loaded from WEB-INF/lib:

 3. Open mail.jsp next to jdbc.jsp (http://localhost:8080/mail.jsp or
    http://localhost:8080/test-0.1/mail.jsp) and see "root Cause
    ClassNotFoundException: javax.mail.Authenticator"


Why is there a difference of behavior from the user's point of view, 
between jdbc datasource and mail session?

Could it be fixed by loading the javamail driver from WEB-INF/lib?

Or could the latest javamail driver be added in the Tomcat's lib 
directory? (There are not many questions for which javamail to use 
anyway and it would make things easier.)

Thanks for your opinion,
Emeric