4

我的项目使用sbt-native-packagerpackageArchetype.java_application。在sbt 阶段,我有一个任务会生成一些最终的 Typesafe 样式配置文件,然后我将其复制到:

target/universal/stage/conf/application.conf

我想将此目录添加到 bash 脚本中的运行时类路径中,并且正在寻找最简单的方法来做到这一点。我不想为如此简单的事情维护一个单独的src/main/templates/bash-template,并且我不知道该怎么做。

谢谢!

4

3 回答 3

10

简答

定义包映射

mappings in Universal <+= (packageBin in Compile, sourceDirectory ) map { 
    (_, src) =>
    // we are using the reference.conf as default application.conf
    // the user can override settings here
    val conf = src / "main" / "resources" / "reference.conf"
    conf -> "conf/application.conf"
}

src/universal/conf中创建一个jvmopts

-Dconfig.file=/<installation-path>/conf/application.conf

添加到build.sbt

bashScriptConfigLocation := Some("${app_home}/../conf/jvmopts")

server_archetype 示例:遵循示例应用程序。可以在这里找到一些描述。

长答案

sbt-native-packager 不直接支持更改类路径,因为它可能会导致类似的问题

  • 类路径排序
  • 安全问题

与 Typesafe Config 一样,大多数使用配置文件的库都提供了一个参数来定义配置文件的位置。使用文档中描述的参数。

看来您正在尝试运行服务器,这意味着您可以使用

packageArchetype.java_server

它旨在读取外部配置。看一下示例应用程序如何使用它。

于 2014-04-02T21:09:49.593 回答
5

以下设置:

scriptClasspath in bashScriptDefines ~= (cp => "../conf" +: cp),

让您完全按照您的需要去做。

在这个特定示例中,我将“../conf”目录添加到类路径条目中。

此外,您需要将以下配置密钥导入您的构建 SBT:

import com.typesafe.sbt.packager.Keys.bashScriptDefines
import com.typesafe.sbt.packager.Keys.scriptClasspath
于 2016-09-26T12:08:30.813 回答
2

您在标题中提出的问题与描述有点不同。我在这里回答标题中的问题 - 即如何将目录添加到类路径中:

这是非常 hacky 和脆弱的,因为如果/当 sbt-native-packager 更改脚本的生成方式时它可能会中断,但现在它对我有用:

private lazy val ClasspathPattern = "declare -r app_classpath=\"(.*)\"\n".r

bashScriptDefines :=  bashScriptDefines.value.map {
                              case ClasspathPattern(classpath) => "declare -r app_classpath=\"/path/to/some/external/lib/*:" + classpath + "\"\n"
                              case _@entry => entry
                          },
于 2014-04-03T19:18:56.563 回答