2016-04-17 19 views
2

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?

+0

Um zu verdeutlichen, funktioniert die DB-Verbindung, wenn Sie den 'Class.forName'-Aufruf hinzufügen? – codefinger

+0

lokal, 'forName()' fängt den JDBC-Treiber des IntelliJ und die Verbindung funktioniert. Auf 'Heroku' löst 'forName() 'die' ClassNotFoundException' aus. – kit

+0

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

Antwort

0

Manchmal führt Bequemlichkeit (wie IntelliJ's Git-Integration zu Heroku schieben, wie ich) zu unerwünschten Problemen.

Ich habe git push verwendet, um meine App auf Heroku zu aktualisieren. Es war alles in Ordnung, außer dass die erforderlichen Bibliotheken nicht funktionierten.
Versucht mvn heroku:deploy, getestet, alles funktioniert! Danke codefinger für den Vorschlag.

Wenn jemand fragt, hier ist, wie Sie es tun, wenn noch nie zuvor getan:
1) Fügen Sie diese auf Ihre pom.xml:

<build> 
     <plugins> 
      <plugin> 
       <groupId>com.heroku.sdk</groupId> 
       <artifactId>heroku-maven-plugin</artifactId> 
       <version>1.0.0</version> 
      </plugin> 
     </plugins> 
    </build> 

2) Führen Sie Maven Ziel heroku:deploy.
Das ist es

Verwandte Themen