Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sbt native packager,我如何简单地在bash脚本';s${app_classpath}?_Bash_Scala_Sbt_Config_Sbt Native Packager - Fatal编程技术网

使用sbt native packager,我如何简单地在bash脚本';s${app_classpath}?

使用sbt native packager,我如何简单地在bash脚本';s${app_classpath}?,bash,scala,sbt,config,sbt-native-packager,Bash,Scala,Sbt,Config,Sbt Native Packager,我的项目使用sbt原生打包机和packageArchetype.java_应用程序。 在sbt阶段,我有一个任务生成一些最终的Typesafe样式配置文件,然后复制到: target/universal/stage/conf/application.conf 我想在bash脚本中将这个目录预先添加到运行时类路径中,并正在寻找最简单的方法。我不想为这么简单的东西维护一个单独的src/main/templates/bash模板,我也不知道该怎么做 谢谢 简短回答 定义包映射 mappings in

我的项目使用sbt原生打包机packageArchetype.java_应用程序。 在sbt阶段,我有一个任务生成一些最终的Typesafe样式配置文件,然后复制到:

target/universal/stage/conf/application.conf
我想在bash脚本中将这个目录预先添加到运行时类路径中,并正在寻找最简单的方法。我不想为这么简单的东西维护一个单独的src/main/templates/bash模板,我也不知道该怎么做


谢谢

简短回答

定义包映射

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"
}
服务器_原型的示例: 遵循规则。可以找到一些描述

长答案

sbt本机打包程序不直接支持更改类路径,因为它可能导致以下问题:

  • 类路径排序
  • 安全问题
与Typesafe配置类似,大多数使用配置文件的库都提供了一个参数来定义配置文件的位置。使用描述的参数

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

packageArchetype.java_server

其设计用于读取外部配置。看看如何使用它。

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

这是非常粗糙和脆弱的,因为如果/当sbt本机打包程序更改脚本的生成方式时,它可能会中断,但目前它对我有效:

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
                          },

以下设置:

scriptClasspath in bashScriptDefines ~= (cp => "../conf" +: cp),
允许您准确地执行您需要的操作

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

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

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

除了创建
src/universal/conf/jvmopts
之外,还可以将以下代码添加到
build.sbt
bashscriptextraldefines+=“addJava”-Dconfig.file=${app_home}/./conf/application.conf”“
要使生成的bat文件在windows上工作,还可以将以下代码添加到
build.sbt
batScriptExtraDefines+=“调用:添加java”-Dconfig.file=%APP\u HOME%\conf\application.conf”“
N.B.可以仅在SBT 1.2中预先设置相对路径。我只需要一次导入:
import nativePackageHelper.\u
这就是我需要做的。在过去的五年中,是否出现了更好的方法?
scriptClasspath in bashScriptDefines ~= (cp => "../conf" +: cp),
import com.typesafe.sbt.packager.Keys.bashScriptDefines
import com.typesafe.sbt.packager.Keys.scriptClasspath