java - 如何为Spark Java提供动态数据库配置凭据?

标签 java gradle kotlin spark-java

我正在使用spark java构建一个简单的REST API。该项目使用Postgres DB进行存储,使用gradle作为构建系统。胖子Jar部署在AWS上。

我有三种环境localstagingproduction。对于每个 fat jar 创建,我想提供特定的配置,例如以下用于本地构建的配置:

    dbHost = "localhost"
    dbUsername = "myusername"
    dbPassword = "mypassword"
    database = "mydb"
    dbPort = "5432"

如何根据fatJar构建变体动态提供这些值?

最佳答案

我通过遵循此示例github项目Kotlin-dev-proxy使用.properties文件。

服务器读取称为app_environment的环境变量,并使用适当的资源文件。

示例代码:

DbConfig.kt

data class DbConfig(
        val dbHost: String,
        val dbUsername: String,
        val dbPassword: String,
        val dbName: String,
        val dbPort: Int)

ServerSettings.kt
class ServerSettings(settings: String) {
    val resources = Properties()

    init {
        val fileUrl: URL = resources.javaClass.getResource("/$settings.properties")
                ?: throw FileNotFoundException("$settings.properties file not found")
        fileUrl.openStream().use { resources.load(it) }
    }

    fun printSettings() = resources.stringPropertyNames().forEach {
        println("Property: $it has value: '${resources[it]}'")
    }

    fun getString(key: String): String = resources[key]!! as String

    fun getInt(key: String): Int = (resources[key]!! as String).toInt()
}

DbConfig.kt
fun provideDbConfig(): DbConfig {
        val settings = ServerSettings(System.getenv("app_environment"))
        settings.printSettings()

        return DbConfig(
                dbHost = settings.getString("dbHost"),
                dbUsername = settings.getString("dbUsername"),
                dbPassword = settings.getString("dbPassword"),
                dbName = settings.getString("dbName"),
                dbPort = settings.getInt("dbPort")
        )
    }

资源/develop.properties
# Local Db values
dbHost=localhost
dbUsername=postgresusername
dbPassword=postgrespassword
dbName=mydbname
dbPort=5432

在Amazon EBS中进行部署时,转到软件配置并添加适合该环境的环境变量(分段/生产)。

关于java - 如何为Spark Java提供动态数据库配置凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43957256/

相关文章:

java - 类似 IDM 的 java 应用程序

android - 为什么 bintrayUpload 无法创建版本 '0.1'? HTTP/1.1 401 未经授权

generics - Kotlin 关于转换为泛型类

java - 如果路径中不存在,则尝试/捕获网络驱动程序

java - 如何防止外部 XMPP 组件发生大小写折叠?

java - 如何在 Windows 上使用 Ubuntu 中的 Windows JDK 构建我的 Gradle 项目?

java - 在使用 Kotlin 的 Android Studio 3.6.1 中,System.out.println(CustomArrayList) 不会在调试时打印值

generics - 为什么 Kotlin 扩展运算符在传递原始 vararg 参数时需要 toTypedArray()?

java - 在 java 中需要默认构造函数吗?

hadoop - java.lang.reflect.InvocationTargetException java.lang.NoClassDefFoundError : com/google/common/io/LimitInputStream 错误