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

3
我已将Java Tomcat应用程序部署到Heroku平台。我需要一个JDBC数据源。因此,我通过Maven war插件在“META-INF”目录中添加了一个“local”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]: Aug 30, 2017 4:38:19 AM org.apache.naming.NamingContext lookup 2017-08-30T04:38:19.523961+00:00 app[web.1]: WARNING: Unexpected exception resolving reference 2017-08-30T04:38:19.523981+00:00 app[web.1]: java.sql.SQLException: Cannot create JDBC driver of class 'org.postgresql.Driver' for connect URL '${JDBC_DATABASE_URL}' 2017-08-30T04:38:19.523983+00:00 app[web.1]: at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2160)

这是不是意味着context.xml文件中对环境变量的引用根本没有引用环境变量?

2个回答

3
有点晚了...但是虽然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}" .../>

1
据我所知,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

当然,你需要用你运行应用程序的命令(在你的Procfileheroku ps中看到)替换java -jar yourapp.jar命令。然后你的Procfile应该包含:
web: start.sh

由于这个shell脚本将可以访问JDBC_DATABASE_URL环境变量,所以生成的context.xml文件将包含完整的URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接