SBT Native Packager 的条件 JavaAgent 命令

Posted

技术标签:

【中文标题】SBT Native Packager 的条件 JavaAgent 命令【英文标题】:Conditional JavaAgent Command for SBT Native Packager 【发布时间】:2021-04-13 14:57:52 【问题描述】:

我正在使用 scala、sbt、sbt-native-package 和可能的 sbt-java-agent 在运行时使用 kubernetes 有条件地激活 datadog java 代理。

通过将dd-java-agent 添加为依赖项并添加脚本sn-p,我只能在特定环境时激活datadog。变量已设置,但这也将 dd-java-agent 添加到类路径中,这是我试图避免的:

val DataDogAgentVersion = "0.70.0"

libraryDependencies += "com.datadoghq" % "dd-java-agent" % DataDogAgentVersion % "runtime"

bashScriptExtraDefines += """if [ "$DD_PROFILING_ENABLED" = "true" ]; then addJava "-javaagent:$app_home/../lib/dd-java-agent-""" + DataDogAgentVersion + """.jar"; fi""""

有没有办法让 sbt 管理 dd-java-agent.jar 的下载,将这个 jar 包含在 lib 目录中(如果需要的话,可以使用其他目录),但从类路径中排除?

我尝试使用 sbt-java-agent 将 jar 放入 dd-java-agent 目录并从类路径中排除 jar,但我无法弄清楚如何将 addJava 语句包装在 if 中检查何时使用那个插件。

感谢您提供的任何帮助!

【问题讨论】:

【参考方案1】:

我最终选择了 sbt-javaagent 插件以避免额外的代码将代理 jar 从插件自动处理的类路径中排除。

技巧/hack 是过滤掉默认的addJava -javaagent line the sbt-javaagent plugin adds automatically,然后附加一个新的脚本片段以仅在某个环境时启用 javaagent。变量已设置。

lazy val dataDogAgentName = "dd-java-agent"
lazy val dataDogAgentVersion = "0.70.0"

lazy val distProject = project
  .enablePlugins(JavaAgent, JavaAppPackaging)
  .settings(
    javaAgents += "com.datadoghq" % dataDogAgentName % dataDogAgentVersion,
    bashScriptExtraDefines := bashScriptExtraDefines.value.filterNot(_.contains("javaagent")) :+ s"""
      |if [[ "$$DD_PROFILING_ENABLED" = "true" ]]; then
      |  addJava "-javaagent:$$app_home/../$dataDogAgentName/$dataDogAgentName-$dataDogAgentVersion.jar";
      |fi
      |""".stripMargin,
  )

【讨论】:

感谢分享这个 但最后你是如何传递代理参数的? .settings( javaAgents += JavaAgent("com.datadoghq" % dataDogAgentName % dataDogAgentVersion, arguments = "my agent arguments") ) -> 似乎在末端被覆盖,将它们直接放入自定义脚本中也不起作用。 嗨@Xorr,在我的场景中,我不需要传递任何自定义参数,但我认为您可以通过在自定义脚本 javaagent 字符串的末尾添加一个冒号来附加它们。 addJava "-javaagent:$$app_home/../$dataDogAgentName/$dataDogAgentName-$dataDogAgentVersion.jar:custom-args";

以上是关于SBT Native Packager 的条件 JavaAgent 命令的主要内容,如果未能解决你的问题,请参考以下文章

Scala - SBT - sbt-native-packager - 保留 `stage` 目录的内容

在 SBT 中为 sbt-native-packager 的 packageMappings 构建路径

sbt-native-packager,挂钩到 debian 包的生命周期

任何使用 sbt-native-packager 的好例子

使用 sbt-native-packager 时的模糊参考

扩展 sbt-native-packager (Docker)