sbt 程序集 fatjar 中的aspectjweaver/javaagent

问题描述 投票:0回答:1

我有一个库,要求我使用aspectjweaver jar 指定javaagent。 例如。

java -jar  -javaagent:/some/location/aspectjweaver-1.8.2.jar myFatJar.jar

这个效果很好。然而,我的 fatjar 将运行的环境没有spectjweaver-1.8.2.jar,我不能把它放在那里(获得一个更可配置的环境可能是我稍后要走的路线)。

有没有办法,最好使用 sbt-assemble,将aspectjweaver 打包到我的fatjar 中,并以这种方式运行它?如果重要的话,我的应用程序是一个使用 Scala 的 Spray 应用程序,使用 sbt 构建。

限制

  • 不能有单独的罐子
  • 可以指定任意java命令
  • 完全控制构建过程
java scala sbt aspectj sbt-assembly
1个回答
2
投票

如果正如您所说,您可以完全控制构建过程,为什么不使用编译时编织而不是加载时编织呢?然后,您只需将 AspectJ 运行时库 aspectjrt.jar 打包到 fat jar 中即可解决问题。您甚至可以避免应用程序启动时运行时编织的开销。

我能想到的导致这种方法出现问题的唯一原因是您需要在构建过程的控制之外编织连接点。


更新 2024 年 3 月 19 日: 如果您在 JRE 9+ 上以 可执行 JAR 的形式运行应用程序(Spring Boot 或其他类型),可能 Agent Embedder Maven Plugin 就是您想要的。

它使您能够在可执行 JAR 中嵌入 Java 代理,并使用

Launcher-Agent-Class
JVM 机制自动启动它。

此插件添加的独特功能,并且通过原始 JVM 机制不可用:您可以

  • 嵌入并运行多个代理(JVM 仅支持一个开箱即用的代理),
  • 选项字符串 传递给每个代理,就像从 JVM 命令行一样。

剧透:我是该插件的作者,也恰好是 AspectJ 的当前维护者。

P.S.:对于 AspectJ 编织器,由于 JVM 很早就启动代理,编织将处于活动状态,无需额外的 Spring 配置,并且它应该适用于所有类加载器 - 不再出现热附加编织器时出现的

ClassLoader [...] does NOT provide an 'addTransformer(ClassFileTransformer)' method
错误通过
spring-instrument.jar

© www.soinside.com 2019 - 2024. All rights reserved.