带有本地打包器的 sbt aspectj

sbt aspectj with native packager

我正在尝试将 sbt-aspectj 插件与 sbt 本机打包程序一起使用,并且 运行 遇到一个问题,其中关联的 -javaagent aspectj 加载时间编织器 jar 路径引用了一个ivy 缓存位置而不是打包的东西。

也就是说,在 运行ning sbt stage 之后,通过 bash -x target/universal/stage/bin/myapp/ 执行暂存应用程序会导致此 javaagent:

exec java -javaagent:/home/myuser/.ivy2/cache/org.aspectj/aspectjweaver/jars/aspectjweaver-1.8.10.jar -cp /home/myuser/myproject/target/universal/stage/lib/org.aspectj.aspectjweaver-1.8.10.jar:/home/myuser/myproject/target/universal/stage/lib/otherlibs.jar myorg.MyMainApp args

我的目标平台是 Heroku,在 Heroku 中构建工件,然后有效地 'pushed' 输出给个人 'dynos'(非常类似于 docker 设置)。这里的问题是生成的 -javaagent 路径在构建 'staged' 可部署的机器上是有效的,但不会存在于最终 运行.

的机器上

如何配置 sbt-aspectj 插件来引用打包的库而不是来自 ivy 缓存的库?


当前配置:

project/plugins.sbt:

addSbtPlugin("com.typesafe.sbt" % "sbt-aspectj" % "0.10.6")
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.5")

build.sbt(部分选):

import com.typesafe.sbt.SbtAspectj._
lazy val root = (project in file(".")).settings(
  aspectjSettings,
  javaOptions in Runtime ++= { AspectjKeys.weaverOptions in Aspectj }.value,
  // see: https://github.com/sbt/sbt-native-packager/issues/598#issuecomment-111584866
  javaOptions in Universal ++= { AspectjKeys.weaverOptions in Aspectj }.value
    .map { "-J" + _ },
  fork in run := true
)

更新

我尝试了几种方法,包括从现有映射中提取 javaOptions 的相关输出,但结果是 sbt 抛出循环依赖错误。

我有一些东西在技术上解决了我的问题,但感觉并不令人满意。截至目前,我直接包含 aspectjweaver 依赖项并使用 bashScriptExtraDefines 的 sbt-native-packager 概念附加适当的 javaagent:

已更新 build.sbt:

import com.typesafe.sbt.SbtAspectj._
lazy val root = (project in file(".")).settings(
  aspectjSettings,
  bashScriptExtraDefines += scriptClasspath.value
    .filter(_.contains("aspectjweaver"))
    .headOption
    .map("addJava -javaagent:${lib_dir}/" + _)
    .getOrElse(""),
  fork in run := true
)

您可以在 sbt 配置中添加以下设置:

.settings(
  retrieveManaged := true,
  libraryDependencies += "org.aspectj" % "aspectjweaver" % aspectJWeaverV)

AspectJ weaver JAR 将被复制到项目根目录中的 ./lib_managed/jars/org.aspectj/aspectjweaver/aspectjweaver-[aspectJWeaverV].jar

我实际上通过使用 sbt-javaagent 插件向运行时添加代理解决了这个问题