Where to put META-INF/services/java.sql.Driver in

2020-07-26 01:35发布

问题:

The javadoc says "to load the my.sql.Driver class, the META-INF/services/java.sql.Driver file would contain the entry: my.sql.Driver".

Don't webapps typically have a META-INF folder as a sibling of WEB-INF? However, JPA specs are looking for persistence.xml in WEB-INF/classes/META-INF/.

Which place is correct for services/java.sql.Driver?

By the way, I am getting "No suitable Driver" exception with it in both locations.

回答1:

You should not provide it yourself. The JDBC driver JAR file should already contain it. At least, if it's a JDBC 4.0 compliant driver. This is also explicitly mentioned in javadoc of DriverManager:

The DriverManager methods getConnection and getDrivers have been enhanced to support the Java Standard Edition Service Provider mechanism. JDBC 4.0 Drivers must include the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC drivers implementation of java.sql.Driver. For example, to load the my.sql.Driver class, the META-INF/services/java.sql.Driver file would contain the entry:

my.sql.Driver

Applications no longer need to explictly load JDBC drivers using Class.forName(). Existing programs which currently load JDBC drivers using Class.forName() will continue to work without modification.

If yours doesn't have, then it's apparently not a JDBC 4.0 compliant driver. You'd need to explicitly load the driver yourself, or to upgrade to a JDBC 4.0 compliant driver, or just use a container managed DataSource (which offers more advantages as well, such as connection pooling).