1

我正在尝试将 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
)
4

2 回答 2

0

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

于 2018-10-24T15:23:33.663 回答
0

You can add the following settings in your sbt config:

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

AspectJ weaver JAR will be copied to ./lib_managed/jars/org.aspectj/aspectjweaver/aspectjweaver-[aspectJWeaverV].jar in your project root.

于 2018-10-24T13:52:06.433 回答