Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku数据库的URL作为Maven的JDBC URL_Maven_Heroku_Flyway_Jooq - Fatal编程技术网

Heroku数据库的URL作为Maven的JDBC URL

Heroku数据库的URL作为Maven的JDBC URL,maven,heroku,flyway,jooq,Maven,Heroku,Flyway,Jooq,我在Heroku上的应用程序使用数据库URL。这很容易用Java解析为带有用户名和密码的JDBCURL。没有问题。然而,我有一个JOOQ生成器和Flyway migrator,它们有maven插件,我不知道如何将这些插件需要的JDBC URL、用户名和密码输入maven。所以目前我在应用程序启动时做这件事,这并不理想。当我的应用程序启动时,我获取数据库URL,解析它,然后进行flyway迁移和jOOQ代码生成。但我希望这种情况发生在实际构建过程中,而不是在应用程序启动期间 基本上我需要Herok

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

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

我认为解决方案可能在于maven build helper插件,但我无法完全正确地获得regex属性规范


感谢

使用Maven可能有很多方法可以解决这个问题,但是一个选择是在
/src/main/resources
路径中保留一个属性文件,使用()加载它,然后使用单独的部分组成URL,例如jOOQ和Flyway:

jdbc:postgresql://${db.host}:${db.port}/${db.database}
${db.username}
${db.password}
希罗库:

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

多亏了heroku的支持,我解决了这个问题。Lukas和Axel您可能希望为使用heroku的任何用户记录此文档,希望在其构建中运行您的工具(vs代码启动),并且不希望手动维护不同的环境变量

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

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

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

org.codehaus.groovy
groovy all
2.3.9
编译
然后是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>

org.codehaus.gmavenplus
gmavenplus插件
1.2
初始化
执行

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

作为记录,对于flyway,您应该能够按原样传递url。无需拆分用户名和密码。@AxelFontaine我仍然认为heroku风格的URL”postgres://user:pass@ec2主机:1234/数据库路径“必须解析为类似于Flyway”jdbc:p的路径ostgresql://ec2-host:1234?user=user&password=pass”“说得好。你说得对。实际上,我必须在maven for flyway和jOOQ中将数据库URL解析为URL、用户和密码。