【问题标题】:Heroku DATABASE_URL as a JDBC Url for MavenHeroku DATABASE_URL 作为 Maven 的 JDBC Url
【发布时间】:2015-03-13 08:08:17
【问题描述】:

我在 Heroku 上的应用使用 DATABASE_URL。这很容易用 Java 解析成带有用户名和密码的 JDBC URL。那里没有问题。但是,我有一个带有 maven 插件的 JOOQ 生成器和 Flyway 迁移器,我不知道如何将这些插件所需的 JDBC URL、用户名和密码获取到 maven。所以目前我在应用程序启动时这样做并不理想。当我的应用程序启动时,我得到 DATABASE_URL,解析它,然后进行 flyway 迁移和 jOOQ 代码生成。但我希望这发生在实际构建过程中,而不是在应用程序启动期间。

基本上我需要格式为 (postgres://user:pass@ec2-host:1234/path-to-db) 的 Heroku 环境变量可以在 maven 中作为这样的属性访问 (jdbc:postgresql:// ec2-host:1234?user=user&password=pass)。

我认为解决方案可能在于 maven 构建助手插件,但我无法完全正确地获取正则表达式属性规范。

谢谢

【问题讨论】:

  • 对于 Flyway,您应该能够按原样传递 url。无需拆分我们的用户名和密码。
  • @AxelFontaine 我仍然认为“postgres://user:pass@ec2-host:1234/path-to-db”的heroku风格的URL必须被解析成这样的飞路“jdbc:postgresql://ec2-host:1234?user=user&password=pass”。
  • 好点。你是对的。

标签: maven heroku flyway jooq


【解决方案1】:

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

在运行 flyway 迁移或 jOOQ 代码生成之前,我们将使用 GMavin Plus 插件运行一些代码以将 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}。

【讨论】:

    【解决方案2】:

    使用 Maven 可能有多种方法可以解决此问题,但一种选择是在您的 /src/main/resources 路径中保留一个属性文件,使用 properties-maven-plugin (an example can be seen in the jOOQ-Spring example) 加载它,然后使用单个零件,例如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>
    

    【讨论】:

    • 我实际上必须在 maven 中将 DATABASE_URL 解析为 flyway 和 jOOQ 的 url、用户和密码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2012-01-29
    • 2018-07-02
    • 1970-01-01
    • 2011-10-09
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多