使用sbt-native-packager,我怎样才能简单地将目录添加到我的bash脚本的$ {app_classpath}?

时间:2014-03-31 21:44:33

标签: bash scala sbt config sbt-native-packager

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

target/universal/stage/conf/application.conf

我想在bash脚本中将此目录添加到运行时类路径中,并且正在寻找最简单的方法。我讨厌维护一个单独的 src / main / templates / bash-template 这么简单的东西,而且我不知道如何去做其他事情。

谢谢!

3 个答案:

答案 0 :(得分: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的示例: 关注example application。可以找到一些描述here

答案很长

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

的问题
  • classpath ordering
  • 安全问题

与Typesafe Config类似,大多数使用配置文件的库都提供了一个参数来定义配置文件的位置。使用参数describe in the documentation

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

packageArchetype.java_server

旨在读取外部配置。看看example application如何使用它。

答案 1 :(得分: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
                          },

答案 2 :(得分:2)

以下设置:

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

允许您完全按照您的需要进行操作。

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

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

import com.typesafe.sbt.packager.Keys.bashScriptDefines
import com.typesafe.sbt.packager.Keys.scriptClasspath