sbt aspectj с родным упаковщиком

Я пытаюсь использовать плагин sbt-aspectj с нативным упаковщиком sbt и сталкиваюсь с проблемой, когда -javaagent путь к ja-образному файлу времени загрузки aspectj ссылается на местоположение кэша плюща, а не на что-то упакованное.

То есть после запуска 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, где артефакты строятся перед тем, как их эффективно "вытолкнуть" на отдельных "динамовцев" (очень похоже на настройку докера). Проблема здесь заключается в том, что результирующий путь -javaagent был действителен на машине, на которой было построено "поэтапное" развертывание, но не будет существовать там, где он в конечном итоге запускается.

Как настроить плагин sbt-aspectj для ссылки на упакованную библиотеку, а не на кеш ivy?


Текущая конфигурация:

Проект / 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
)

2 ответа

Я на самом деле решил это с помощью плагина sbt-javaagent для добавления агентов во время выполнения

Вы можете добавить следующие настройки в вашу конфигурацию sbt:

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

JAR AspectJ Weaver будет скопирован в ./lib_managed/jars/org.aspectj/aspectjweaver/aspectjweaver-[aspectJWeaverV].jar в корне вашего проекта.

Другие вопросы по тегам