【问题标题】:sbt aspectj with native packager带有本机打包程序的 sbt aspectj
【发布时间】:2017-11-15 19:07:30
【问题描述】:

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

也就是说,在运行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,在其中构建工件,然后有效地“推送”到单个“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 依赖项,并使用 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-javaagent 插件将代理添加到运行时解决了这个问题

标签: sbt aspectj sbt-native-packager sbt-aspectj


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 2016-12-01
      • 2018-11-05
      • 2015-04-13
      • 2018-12-24
      • 2017-05-23
      • 2012-02-15
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多