Eine reine Java-Server-App für Heroku mit Maven schreiben. Verbindung mit der Postgres-Datenbank von Heroku.
Alles funktioniert, wenn lokal ausgeführt wird, die IntelliJ-Konfig für die Ausführung von Java-Anwendungen verwenden, die Heroku-DB-URL als Umgebungsvariable angeben. Die App funktioniert und ich kann mich mit der DB verbinden.
Anmerkung: Ich fand heraus, dass IntelliJ irgendwie seine eigene Postgres-Treiber automatisch verwendet, die, die ich in pom.xml angegeben, offensichtlich
jedoch ignoriert wird, wenn ich die App bereitstellen , i in der folgenden Fehler angezeigt mein Heroku einzuloggen, sobald ich an die DB verbinden:
java.lang.ClassNotFoundException: org.postgresql.Driver
Heroku kann Postgres JDBC-Treiber nicht finden
ich das Heroku Tutorial gefolgt, aber als ich sah, dass es keine Verbindung ist, lege ich
Class.forName("org.postgresql.Driver");
vor
String dbUrl = System.getenv("JDBC_DATABASE_URL");
return DriverManager.getConnection(dbUrl);
nur um sicherzustellen, dass der Treiber gefunden wird. Wenn ich Class.forName()...
check entferne, bekomme ich die no suitable driver found for
[meine db url] Fehler.
den letzten Fehler betrifft, so habe ich versucht, sowohl JDBC_DATABASE_URL und DATABASE_URL env vars und sogar die DB-URL "von Hand" konstruiert, mit sslmode=require
etc, aber noch kein Glück.
Mein pom.xml hat modelVersion, groupId, artifactId, Version und Name angegeben, sowie:
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1208</version>
</dependency>
</dependencies>
Mein procfile, dass Heroku verwendet die App zu starten, sieht wie folgt aus:
web: java $JAVA_OPTS -cp target/classes:"target/dependency/*" Main --port $PORT
Wenn ich die App bereitstellen, bekomme ich keine Fehler, Build ist erfolgreich.
Was kann die Ursache dafür sein, dass der Treiber nicht geladen wird? Vergesse ich etwas in pom.xml, Procfile oder etwas anderem?
Um zu verdeutlichen, funktioniert die DB-Verbindung, wenn Sie den 'Class.forName'-Aufruf hinzufügen? – codefinger
lokal, 'forName()' fängt den JDBC-Treiber des IntelliJ und die Verbindung funktioniert. Auf 'Heroku' löst 'forName() 'die' ClassNotFoundException' aus. – kit
Kannst du überprüfen, ob sich die JAR-Datei für postgres in deinem Heroku-Slug befindet, indem du 'heroku run ls target/dependency /' ausführst? – codefinger