基于Heroku Tomcat的部署:context.xml环境变量

时间:2017-08-30 04:57:21

标签: java tomcat heroku heroku-postgres context.xml

我已经在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中对环境变量的引用根本没有引用环境变量?

2 个答案:

答案 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命令(如Procfileheroku 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}" .../>