我正在尝试将 sbt-aspectj 插件与 sbt 本机打包程序一起使用,并且遇到了一个问题,-javaagent
即 aspectj 加载时间编织器 jar 的关联路径引用了常春藤缓存位置而不是打包的内容。
也就是说,在运行之后,通过这个 javaagent 中的结果sbt stage
执行暂存的应用程序:bash -x target/universal/stage/bin/myapp/
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,其中工件在被有效地“推送”到单个“dynos”之前构建(非常类似于 docker 设置)。这里的问题是生成的 -javaagent 路径在构建“分阶段”可部署的机器上有效,但在最终运行的地方不存在。
如何配置 sbt-aspectj 插件以引用打包的库而不是常春藤缓存中的库?
当前配置:
项目/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 依赖项,并使用 sbt-native-packager 的概念bashScriptExtraDefines
来附加一个适当的 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
)