maven - Heroku DATABASE_URL 作为 Maven 的 JDBC Url

标签 maven heroku flyway jooq

我在 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 构建帮助程序插件,但我无法完全正确地获得正则表达式属性规范。

谢谢

最佳答案

感谢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}。

关于maven - Heroku DATABASE_URL 作为 Maven 的 JDBC Url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954841/

相关文章:

spring-boot - 无法获取表锁 - 另一个 Flyway 实例可能正在运行

java - maven项目出现错误:FirefoxDriver cannot be resolved to a type

尝试访问 Nexus 私有(private)存储库时,maven 收到 "Not Authorized"

node.js - node.js 的 Heroku worker

php - 使用 wkhtmltopdf 静态二进制文件时找不到 libjpeg.so.8

flyway - 占位符如何在 Flyway 中工作?

java - 如何将其他位置的文件复制到 Docker 镜像中

java - 如何将 Swagger 与 Maven + Java + Jersey +Tomcat 集成

node.js - Heroku web : npm ERR! 缺少脚本:开始

mysql - 在 Flyway 脚本中安全地重命名 MySQL 表名