Ответ 1
Спасибо Reimeus за ответ. mysql-connector-java-5.1.26-bin.jar
должен находиться в пути пути выполнения.
Run → Run Configurations... → Classpath → Добавить внешний JAR.
Очистите все, повторите попытку, и Исключение закончилось.
Я пытаюсь получить данные из базы данных MySQL через Hibernate, но я застрял в этой ошибке:
Failed to create sessionFactory object.org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver could not be loaded
java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
[...]
Я использую класс DAOFactory для сеанса спящего режима:
public class DAOFactory {
private static boolean isInstance = false;
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
private static Session session;
private DAOFactory() throws ExceptionInInitializerError{
if( !isInstance ) {
try {
Configuration cfg = new Configuration().configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
.buildServiceRegistry();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object."+ ex);
throw new ExceptionInInitializerError(ex);
}
session = sessionFactory.openSession();
isInstance = true ;
}
}
public static DAOFactory getInstance() {
return new DAOFactory() ;
}
public Session getSession() {
return session ;
}
}
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="">
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/enigma</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
И mysql-connector-java-5.1.26-bin.jar
уже находится в пути к классам:
Кто-нибудь видит, что мне не хватает?
Спасибо Reimeus за ответ. mysql-connector-java-5.1.26-bin.jar
должен находиться в пути пути выполнения.
Run → Run Configurations... → Classpath → Добавить внешний JAR.
Очистите все, повторите попытку, и Исключение закончилось.
Для тех, кто использует Maven: добавьте следующую зависимость в pom.xml.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
или выберите другую версию из здесь.
Затем вы можете получить артефакт, используя:
mvn dependency:resolve
(если вы не используете IDE).
В некоторых случаях может быть неуместным решение добавить jar
в classpath
через Run → Run Configurations... → Classpath → Add external JAR.
Первый случай
Когда файл jar
не может быть помещен в папку classpath
, существует альтернативный способ загрузки класса из другого места. Вам просто нужно создать экземпляр URLClassLoader и затем вызвать loadClass()
для него (упоминалось здесь):
URLClassLoader urlCL = new URLClassLoader(new URL[] {"path_to_jar"});
Class driverClass = urlCL.loadClass("com.mysql.jdbc.Driver");
Второй случай
Если вы хотите добавить свой класс в classpath
во время выполнения (я предпочитаю ответ Ranjit Aneesh здесь), для этого вы можете создать очень простой пользовательский загрузчик классов, расширяющий URLClassLoader с единственным переопределенным методом addUrl
:
public class DynamicURLClassLoader extends URLClassLoader {
public DynamicURLClassLoader(URLClassLoader classLoader) {
super(classLoader.getURLs());
}
@Override
public void addURL(URL url) {
super.addURL(url);
}
}
Затем вызовите его:
URLClassLoader urlCL = (URLClassLoader) ClassLoader.getSystemClassLoader();
new DynamicURLClassLoader(urlCL).addURL("path_to_jar");
в идее intellij перейдите file-> структура проекта → библиотека и добавьте mysql-connector-java-5.1.26-bin.jar. тогда будет доступен com.mysql.jdbc.Driver