Heroku DATABASE_URL 作为 Maven 的 JDBC Url
Heroku DATABASE_URL as a JDBC Url for Maven
我在 Heroku 上的应用程序使用 DATABASE_URL。这很容易用 Java 解析成带有用户名和密码的 JDBC URL。那里没有问题。但是,我有一个 JOOQ 生成器和带有 maven 插件的 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 构建助手插件,但我无法完全正确地获取正则表达式属性规范。
谢谢
可能有无数种方法可以用 Maven 解决这个问题,但一个选择是在 /src/main/resources
路径中保留一个属性文件,使用 properties-maven-plugin
(an 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>
感谢 heroku 的支持,我已经解决了这个问题。 Lukas 和 Axel 你可能想为任何使用 heroku 的用户记录这个,想要 运行 你的工具在他们的构建(vs 代码启动)中,并且不想手动维护不同的环境变量。
我们将使用 GMavin Plus 插件 运行 一些代码来将 DATABASE_URL 环境变量解析为属性,然后再 运行 进行 flyway 迁移或 jOOQ 代码生成。
首先你需要添加 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>
现在您可以在飞行路线、jOOQ 或任何其他配置中使用 ${database.jdbcUrl}、${database.username} 和 ${database.password}。
我在 Heroku 上的应用程序使用 DATABASE_URL。这很容易用 Java 解析成带有用户名和密码的 JDBC URL。那里没有问题。但是,我有一个 JOOQ 生成器和带有 maven 插件的 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 构建助手插件,但我无法完全正确地获取正则表达式属性规范。
谢谢
可能有无数种方法可以用 Maven 解决这个问题,但一个选择是在 /src/main/resources
路径中保留一个属性文件,使用 properties-maven-plugin
(an 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>
感谢 heroku 的支持,我已经解决了这个问题。 Lukas 和 Axel 你可能想为任何使用 heroku 的用户记录这个,想要 运行 你的工具在他们的构建(vs 代码启动)中,并且不想手动维护不同的环境变量。
我们将使用 GMavin Plus 插件 运行 一些代码来将 DATABASE_URL 环境变量解析为属性,然后再 运行 进行 flyway 迁移或 jOOQ 代码生成。
首先你需要添加 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>
现在您可以在飞行路线、jOOQ 或任何其他配置中使用 ${database.jdbcUrl}、${database.username} 和 ${database.password}。