【发布时间】:2016-08-09 13:02:18
【问题描述】:
使用 Maven 为 Heroku 编写纯 Java 服务器应用程序。
连接到 Heroku 的 Postgres 数据库。
本地运行时一切正常,使用 IntelliJ 的配置运行 Java 应用程序,将 Heroku 的 DB URL 指定为环境变量。该应用程序工作正常,我可以连接到数据库。
注意:我发现 IntelliJ 以某种方式自动使用它自己的 Postgres 驱动程序,我在 pom.xml 中指定的驱动程序显然被忽略了
但是,当我部署应用程序时,我一连接到数据库就会在 Heroku 日志中收到以下错误:java.lang.ClassNotFoundException: org.postgresql.Driver
我按照Heroku的教程,但是看到没有连接的时候,我放了
Class.forName("org.postgresql.Driver");
之前
String dbUrl = System.getenv("JDBC_DATABASE_URL");
return DriverManager.getConnection(dbUrl);
只是为了确保找到驱动程序。如果我删除 Class.forName()... 检查,我会收到 no suitable driver found for [my db url] 错误。
关于最后一个错误,我尝试了 JDBC_DATABASE_URL 和 DATABASE_URL 环境变量,甚至使用 sslmode=require 等“手动”构建 DB URL,但仍然没有运气。
我的 pom.xml 指定了 modelVersion、groupId、artifactId、version 和 name,以及:
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1208</version>
</dependency>
</dependencies>
Heroku 用来启动应用程序的我的 Procfile 如下所示:
web: java $JAVA_OPTS -cp target/classes:"target/dependency/*" Main --port $PORT
当我部署应用程序时,我没有收到任何错误,构建成功。
驱动程序无法加载的原因可能是什么?我是否忘记了 pom.xml 或 Procfile 中的某些内容或其他内容?
【问题讨论】:
-
澄清一下,当您添加
Class.forName调用时,数据库连接是否有效? -
在本地,
forName()捕获 IntelliJ 的 jdbc 驱动程序并且连接正常。在 Heroku 上,forName()触发ClassNotFoundException -
您能否通过运行
heroku run ls target/dependency/来检查postgres jar 文件是否在您的Heroku slug 中? -
我收到
ls: cannot access target/dependency/: No such file or directory -
这表明您的 JAR 文件没有被出售(即在构建期间复制到目标目录中)。您是使用
git push还是mvn heroku:deploy进行部署?
标签: java postgresql maven heroku jdbc