Heroku DATABASE_URL作为Maven的JDBC Url

时间:2015-01-15 00:14:38

标签: maven heroku flyway jooq

Heroku上的我的应用程序使用DATABASE_URL。使用用户名和密码将Java解析为JDBC URL很简单。那里没有问题。但是,我有一个具有maven插件的JOOQ生成器和Flyway迁移器,我无法弄清楚如何将这些插件所需的JDBC URL,用户名和密码输入到maven中。所以目前我在app启动时这样做并不理想。当我的应用程序启动时,我得到DATABASE_URL,解析它,然后执行flyway迁移和jOOQ代码生成。但我希望在实际构建过程中发生这种情况,而不是在应用程序启动期间。

基本上我需要Heroku Environment变量格式化为(postgres:// user:pass @ ec2-host:1234 / path-to-db)可以在maven中作为这样的属性访问(jdbc:postgresql:// EC2主机:1234用户=用户安培;密码=通过)。

?。

我认为解决方案可能在于maven build helper插件,但我无法正确地获得正则表达式属性规范。

由于

2 个答案:

答案 0 :(得分:4)

感谢heroku的支持,我已经解决了这个问题。 Lukas和Axel你可能想要为使用heroku的任何用户记录这个,想要在他们的构建中运行你的工具(vs代码启动),并且不想手工维护不同的环境变量。

我们将使用GMavin Plus插件运行一些代码,在运行flyway迁移或jOOQ代码生成之前将DATABASE_URL环境变量解析为属性。

首先,您需要将Groovy添加为依赖项:

<dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>2.3.9</version>
  <scope>compile</scope>
</dependency>

然后是GMaven plus插件:

<plugin>
  <groupId>org.codehaus.gmavenplus</groupId>
  <artifactId>gmavenplus-plugin</artifactId>
  <version>1.2</version>
  <executions>
    <execution>
      <phase>initialize</phase>
      <goals>
        <goal>execute</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <scripts>
      <script><![CDATA[
        URI dbUri = new URI(System.getenv("DATABASE_URL"));

        String username = dbUri.getUserInfo().split(":")[0];
        String password = dbUri.getUserInfo().split(":")[1];
        int port = dbUri.getPort();

        String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ":" + port + dbUri.getPath();

        project.properties['database.jdbcUrl']=dbUrl
        project.properties['database.username']=username
        project.properties['database.password']=password
        ]]></script>
      </scripts>
    </configuration>
</plugin>

现在,您可以在flyway,jOOQ或其他任何配置中使用$ {database.jdbcUrl},$ {database.username}和$ {database.password}。

答案 1 :(得分:0)

使用Maven可能有多种方法可以解决这个问题,但有一个选择是在/src/main/resources路径中保留一个属性文件,使用properties-maven-pluginan example can be seen in the jOOQ-Spring example)加载它,然后使用各个部分组成URL,例如jOOQ和Flyway:

<url>jdbc:postgresql://${db.host}:${db.port}/${db.database}</url>
<user>${db.username}</user>
<password>${db.password}</password>

的Heroku:

<database_url>postgres://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}</database_url>