我已经在Heroku平台上部署了一个Java Tomat应用程序。我需要一个JDBC数据源。所以我通过maven war插件在“META-INF”目录中添加了一个“本地”context.xml。
Heroku提供了一个系统环境变量JDBC_DATABASE_URL,在添加到context.xml时应该像我的目的一样:
<Resource name="jdbc/postgresqldb" auth="Container" type="javax.sql.DataSource"
url="${JDBC_DATABASE_URL}"
driverClassName="org.postgresql.Driver" initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5" validationQuery="select 1"
poolPreparedStatements="true"/>
但是,我无法使其发挥作用,必须采取以下措施:
<Resource name="jdbc/postgresqldb" auth="Container" type="javax.sql.DataSource"
username="tzse*********" password="bea7c190************************************************"
url="jdbc:postgresql://ec2-54-163-227-202.compute-1.amazonaws.com:5432/****************?sslmode=require"
driverClassName="org.postgresql.Driver" initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5" validationQuery="select 1"
poolPreparedStatements="true"/>
我基本上复制并硬编码环境变量。这很好用,但不便携,绝对难看!
任何暗示我出错的地方以及我能做些什么才能做到正确?
在Heroku控制台中我可以看到:
2017-08-30T04:38:19.523960 + 00:00 app [web.1]:2017年8月30日上午4:38:19 org.apache.naming.NamingContext lookup 2017-08-30T04:38:19.523961 + 00:00 app [web.1]:警告:意外异常解析参考 2017-08-30T04:38:19.523981 + 00:00 app [web.1]:java.sql.SQLException:无法为连接URL'$ {JDBC_DATABASE_URL}'创建类'org.postgresql.Driver'的JDBC驱动程序 2017-08-30T04:38:19.523983 + 00:00 app [web.1]:at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2160)<< em>
这是否意味着context.xml中对环境变量的引用根本没有引用环境变量?
答案 0 :(得分:0)
据我所知,context.xml
不支持环境变量。作为替代方案,我建议在应用启动时动态编写context.xml
文件。您可以通过创建用于启动应用程序的特殊start.sh
脚本并将以下代码放入其中来执行此操作:
#!/usr/bin/env bash
cat << EOF > context.xml
<Resource name="jdbc/postgresqldb" auth="Container" type="javax.sql.DataSource"
url="${JDBC_DATABASE_URL}"
driverClassName="org.postgresql.Driver" initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5" validationQuery="select 1"
poolPreparedStatements="true"/>
EOF
java -jar yourapp.jar
当然,您需要使用用于运行应用的命令替换java -jar yourapp.jar
命令(如Procfile
或heroku ps
中所示)。那么你Procfile
应该包含:
web: start.sh
由于此shell脚本可以访问JDBC_DATABASE_URL
环境变量,因此生成的context.xml
文件将包含完整的URL。
答案 1 :(得分:0)
有点晚了......但是虽然context.xml可能不支持环境变量(例如$JDBC_DATABASE_URL
),但它支持Java系统属性。可以将Heroku的环境变量作为系统属性传递给您的应用程序。
使用Procfile(基本上是带有前缀的Java命令)和webapp-runner:
web: java -cp "target/dependency/*" $JAVA_OPTS -DDB_URL=$JDBC_DATABASE_URL webapp.runner.launch.Main --enable-naming --port $PORT target/*.war
此处,$JAVA_OPTS
和$JDBC_DATABASE_URL
都是环境变量,而-DDB_URL
将创建系统属性。在context.xml中,使用${DB_URL}
:
<Resource name="jdbc/postgresqldb" url="${DB_URL}" .../>