LINUX.ORG.RU

No suitable driver found for jdbc:postgresql

 , , , ,


0

1

Имеется spring-mvc проект. На локальной системе через mvn tomcat7:run запускается без проблем. При попытке деплоя на удаленный сервер (centos7/tomcat7 из репозитория) получаю следующее:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/spring/datasource-tx-jpa.xml]: Invocation of init method failed; nested exce
<------>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1634)
<------>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
<------>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
<------>at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
<------>at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
<------>at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
<------>at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:220)
<------>at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1018)
<------>at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:988)
<------>at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:579)
<------>at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:546)
<------>at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:707)
<------>at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:680)
<------>at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
<------>at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
<------>at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354)
<------>... 76 more
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
<------>at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:396)
<------>at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371)
<------>at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336)
<------>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1692)
<------>at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630)
<------>... 91 more
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
<------>at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115)
<------>at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
<------>at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
<------>at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
<------>at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:69)
<------>at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60)
<------>at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40)
<------>at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:65)
<------>at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.<init>(DatabaseInformationImpl.java:59)
<------>at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:132)
<------>at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:61)
<------>at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191)
<------>at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
<------>at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
<------>at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
<------>at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)
<------>at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
<------>at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360)
<------>at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384)
<------>... 95 more
Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgresql://192.168.0.101/test
<------>at java.sql.DriverManager.getConnection(DriverManager.java:689)
<------>at java.sql.DriverManager.getConnection(DriverManager.java:208)
<------>at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)
<------>at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)
<------>at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:196)
<------>at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:159)
<------>at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
<------>at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)
<------>at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43)
<------>... 109 more

Конфиги одинаковые. В pom.xml прописан драйвер, пробовала разные версии, на десктопе работает, на сервере нет:

        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4.1212</version>
        </dependency>
jar вместе с другими зависимостями попадает в /lib каталог проекта:
[root@dev lib]# pwd
/usr/share/tomcat/webapps/ROOT/WEB-INF/lib
[root@dev lib]# find . -name "*postgresql*"
./postgresql-9.4.1212.jar
[root@dev lib]# 
В чем может быть проблема? Tomcat из репов centos привносит свою магию. Сначала билась над тем, что hibernate-validator шестой ветки с ним несовместим из-за старого tomcat-el, теперь вот это. Гуглёж ничего не дал.


Если совет выше не проканает, попробуй встать удаленным отладчиком на строчку в `DriverManager.getConnection` и посмотреть, что там происходит

stevejobs ★★★★☆
()

Настоятельно рекомендую выбросить все эти репы центоса, скачать томкат с сайта, распаковать куда душе угодно и попробовать запускать с ним. С JDK настоятельно рекомендую сделать то же самое (с сайта оракла), если не уже. Дистроделы частенько с жавой умудряются создать проблемы на ровном месте.

Legioner ★★★★★
()
Ответ на: комментарий от hippi90

Попробуй положить драйвер в $CATALINA_HOME/lib, а в pom.xml в dependency добавь <scope>provided</scope>

Этот вариант не помог.

totik
() автор топика
Ответ на: комментарий от totik

И Java на сервере 1.8 или выше? Ваш артефакт собран для 1.8+: «Java JDBC 4.2 (JRE 8+) driver for PostgreSQL database». Чисто ради интереса попробуйте использовать 9.4.1212.jre7 или 9.4.1212.jre6 варианты, в зависимости от версии на сервере.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)
Ответ на: комментарий от Legioner

Настоятельно рекомендую выбросить все эти репы центоса, скачать томкат с сайта, распаковать куда душе угодно и попробовать запускать с ним. С JDK настоятельно рекомендую сделать то же самое (с сайта оракла), если не уже. Дистроделы частенько с жавой умудряются создать проблемы на ровном месте.

Развернула tomcat 9 скачанный с официального сайта. Картина та же самая. По части взаимодействия с СУБД через этот драйвер у жабки из репозитория проблем нет, ибо mvn tomcat7:run на удаленном сервере корректно запускает проект.

totik
() автор топика
Ответ на: комментарий от sanwashere
[root@dev logs]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@dev logs]#

Да, java восьмая. Варианты драйвером для других версий вызывают ту же ошибку.

totik
() автор топика
Ответ на: комментарий от totik

Большинство предыдущих ответов не относятся к делу. Хотя сообщение об ошибке самообъясняющееся. Программа не находит jar-файл с JDBC-драйвером PostgreSQL. Значит, надо поместить его в ту папку, где найдёт. Это может быть папка lib самой программы-то есть, .../WEB-INF/lib внутри war-файла с программой. Ещё в Tomcat-е есть папка, куда можно помещать jar-файлы, которые могут понадобиться разным программам, а именно в $CATALINA_HOME/lib.

Partisan ★★★★
()
Ответ на: комментарий от Partisan

Этот jar вместе с остальными зависимостями проекта помещен автоматически мавеном в WEB-INF/lib. Так же я вручную копировала его в $CATALINA_HOME/lib.

totik
() автор топика
Ответ на: комментарий от totik

там надо всего два параметра при запуске прописать и подцепиться отладчиком (та же IDE). погугли

bvn13 ★★★★★
()
Ответ на: комментарий от totik

Уберите из $CATALINA_HOME/lib во избежание путаницы между двумя библиотеками драйвера( оно ещё может быть неправильным, но если убрать оттуда, то это можно и не проверять). Если место правильное, то возможно, ошибка в Java коде загрузки JDBC драйвера, а именно в class.forMame() может быть задано неправильное имя класса. Я вообще не применяю class.forName(), это старомодный способ. Вместо этого использую DriverManager.getConnection(), при котором задавать имя класса драйвера не нужно.

Partisan ★★★★
()
Ответ на: комментарий от Partisan

У меня нет в проекте сервисного кода по загрузке драйверов. Я использую spring/jpa/hibernate.

totik
() автор топика
Ответ на: комментарий от stevejobs

Подключилась удаленно. Захожу в JdbcEnvironmentInitiator.initiateService, далее попадаю в DriverManagerDataSource.getConnectionFromDriverManager, из этого метода вызывается DriverManager.getConnection.

Внутри registeredDrivers оказывается пуст. Ведь прошли те времена, когда драйверы нужно было вручную подключать?

totik
() автор топика
Ответ на: комментарий от totik

А, так ты не задаёшь класс драйвера. Хз, прошли ли, я всегда указываю. Попробуй указать driverClassName в DriverManagerDataSource-е. По крайней мере ошибка будет ближе к делу.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

ДАЙ ПЯТЮНЮ БРО

почему-то пакеты с джавасофтом в gnu-linux собирают одни шизики

джавасофт лучше всего качать с оффсайта и добавлять в $PATH

stevejobs ★★★★☆
()
Ответ на: комментарий от totik

а ты прям в момент отладки попробуй сделать

Class.forName(«org.postgresql.Driver»);

в IntelliJ IDEA консоль для динамического ввода кода через Alt+F8 в Win (в маке так же) открывается, но я не помню, работает ли она для удаленной отладки :-)

или в код софтины пропиши, если ты сама его написала

если класс найдется - значит все-таки проблемы с настройкой Hibernate, и надо показать нам как ты его настраиваешь

если класс не найдется - надо продолжать шаманить с classpath твоего томката

вообще, имхо, вся эта история с сервелет-контейнерами и аппсерверами - жуткая срань, и пора бы уже им сдохнуть

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

вообще, имхо, вся эта история с сервелет-контейнерами и аппсерверами - жуткая срань, и пора бы уже им сдохнуть

А я думал в этом вся суть джавки

anonymous
()
Ответ на: комментарий от Legioner

А, так ты не задаёшь класс драйвера. Хз, прошли ли, я всегда указываю. Попробуй указать driverClassName в DriverManagerDataSource-е. По крайней мере ошибка будет ближе к делу.

Бинго! Заработало! Ну елки-палки! Почему же запуская локально через mvn tomcat7:run указание драйвера не требовалось?

Спасибо всем, кто откликнулся.

totik
() автор топика
Ответ на: комментарий от totik

Почему же запуская локально через mvn tomcat7:run указание драйвера не требовалось?

Я детали не знаю, но по идее DriverManager при запуске сканирует ClassPath, ковыряется во всех jar-файлах и ищет там всякие META-INF/services/java.sql.Driver. Если нашёл, то регистрирует драйвер. Значит на линуксе твоём по какой-то причине он этого поиска не производит или же драйвер не находит (ещё более странно). Тут надо ковыряться, в какой момент он этот поиск пытается делать, отладчиком цепляться и смотреть, почему не находит. Может там какой-нибудь флаг есть, чтобы пропустить этот поиск (перелопатить все jar-файлы это определённая работа, в частности из-за подобных технологий всякие томкаты так долго стартуют), который у тебя включён.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Что такое CLASSPATH для Tomcat-а - не так очевидно, поскольку Tomcat использует несколько загрузчиков классов (необходимо ознакомиться с ними в документации по Tomcat-у). В результате если класс есть и загружен, но не тем загрузчиком классов, то он может быть не найден программой. Поэтому иногда лучше обходиться без дубликатов jar-файлов в разных папках. Но это не недостаток Tomcat-а , сервлетов и Java, а факт, означающий, что для пользования ими нужны некоторые знания.

Partisan ★★★★
()

Эх, как же я рада! Настроила nginx с proxy на tomcat. Проект деплоится одной командой, красота Как же хороша и удобна жабка, когда все работает =)

totik
() автор топика
Ответ на: комментарий от stevejobs

Так видимо он кроме них больше никому не нужен.

anonymous
()
Ответ на: комментарий от totik

Ня!

Обращайтесь еще!

Пишите на джавке, пишите лучше джавки!

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.