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

如何为Spark Java提供动态数据库配置凭据?,java,gradle,kotlin,spark-java,Java,Gradle,Kotlin,Spark Java,我正在使用spark java构建一个简单的REST API。该项目使用PostgresDB进行存储,gradle作为构建系统。fat Jar部署在AWS上 我有三个环境local,staging和production。对于每个fat jar创建,我想提供如下用于本地构建的特定配置: dbHost = "localhost" dbUsername = "myusername" dbPassword = "mypassword" database = "mydb"

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

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

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

如何基于fatJar构建变量动态提供这些值

我使用了
.properties
文件来跟踪这个示例github项目

服务器读取名为
app\u environment
的环境变量,并使用适当的资源文件

示例代码:

DbConfig.kt

data class DbConfig(
        val dbHost: String,
        val dbUsername: String,
        val dbPassword: String,
        val dbName: String,
        val dbPort: Int)
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()
}
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")
        )
    }
ServerSettings.kt

data class DbConfig(
        val dbHost: String,
        val dbUsername: String,
        val dbPassword: String,
        val dbName: String,
        val dbPort: Int)
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()
}
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")
        )
    }
DbConfig.kt

data class DbConfig(
        val dbHost: String,
        val dbUsername: String,
        val dbPassword: String,
        val dbName: String,
        val dbPort: Int)
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()
}
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")
        )
    }
资源/development.properties

# Local Db values
dbHost=localhost
dbUsername=postgresusername
dbPassword=postgrespassword
dbName=mydbname
dbPort=5432

在Amazon EBS中部署时,转到软件配置,并为环境添加适当的环境变量(暂存/生产)。

每个环境的属性文件如何?例如
config local.properties
config production.properties
,etc@k.liakos谢谢你的提示:)我已经按照同样的方法解决了这个问题。我在回答中给出了详细的解决方案。