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
в корне вашего проекта.