使用sbt-native-packager,我该如何简单地在我的Bash脚本的${app_classpath}前添加一个目录?

5

我的项目使用sbt-native-packagerpackageArchetype.java_application。在sbt stage期间,我有一个任务生成一些最终的Typesafe风格的配置文件,然后将其复制到:

target/universal/stage/conf/application.conf

我想在bash脚本中在运行时类路径之前添加此目录,并寻找最简单的方法来实现。我不想为如此简单的事情维护一个单独的src/main/templates/bash-template,也没有看到其他正确的方法。谢谢!
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不直接支持更改classpath,因为它可能会引起问题,比如:

  • classpath排序
  • 安全问题

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

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

packageArchetype.java_server

该工具旨在读取外部配置。请查看示例应用程序以了解如何使用它。


5
可以将以下代码添加到build.sbt中,而不是创建src/universal/conf/jvmopts文件:bashScriptExtraDefines += """addJava "-Dconfig.file=${app_home}/../conf/application.conf""""这行代码的作用是向 Bash 脚本添加额外的 Java 参数,以便指定应用程序配置文件的位置。 - Trev
为了使生成的bat文件在Windows上正常工作,还需要将以下内容添加到build.sbt中。 batScriptExtraDefines += """call:add_java"-Dconfig.file=%APP_HOME%\conf\application.conf"""" - user5698801

6
以下设置:
scriptClasspath in bashScriptDefines ~= (cp => "../conf" +: cp),

让你能够精确地完成所需操作。

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

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

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

2
注:仅允许前置相对路径。 - Alexander Vasiljev
在SBT 1.2中,我只需要一个导入:import NativePackagerHelper._ - Igor Urisman

2

您在标题中提出的问题与描述中略有不同。我在此回答标题中的问题 - 即如何将目录前置到类路径中:

这种方法非常具有hack性和脆弱性,因为如果/当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
                          },

这就是我需要做的。在过去的五年里,是否出现了更好的方法? - Troy Daniels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接