【问题标题】:How to embed a javaagent in spring boot app using boot gradle plugin如何使用 boot gradle 插件在 Spring Boot 应用程序中嵌入 javaagent
【发布时间】:2017-12-18 18:34:50
【问题描述】:

我正在为我的 Spring Boot 应用程序使用 javaagent,目前我正在通过它运行它

java -javaagent:agent.jar -jar app.jar

我的项目是一个 gradle 项目,我想将 agent.jar 嵌入到 app.jar 中,这样我就可以运行它了

java -javaagent:app.jar -jar app.jar

可以通过此处提到的引导 maven 插件来完成 - https://jeroendruwe.be/spring-boot-and-new-relic/ 但引导 gradle 插件没有替代品。我找到的最接近的是这个 - https://jdpgrailsdev.github.io/blog/2014/04/08/spring_boot_gradle_newrelic.html,但它没有按预期嵌入 jar。

有没有办法通过 gradle 完成?

【问题讨论】:

  • 这样做的目的是什么?将 infrastructural/util/etc 库嵌入到微服务中绝对不是最佳实践,您的 Spring Boot 应用程序可能就是这样。
  • 目的是spring boot应用在cloud Foundry中运行,我们还没有为那个代理提供任何服务。所以我希望代理 jar 嵌入到引导 jar 中,这样我们就可以将它推送到 cf 并在没有任何其他配置更改的情况下完成它。

标签: java spring-boot javaagents spring-boot-gradle-plugin


【解决方案1】:

可以从本地目录添加为依赖jar。 'libs' 是项目中的目录。

依赖{ 编译文件树(目录:'libs',包括:'*.jar') }

【讨论】:

  • 这会将它放在 BOOT-INF/lib 目录下,在引导期间不会加载代理 jar。但我希望代理 jar 的类位于引导 jar 的最顶层目录中,以便 MANIFEST.MF 中的 Pre-Main 指令可以找到该类。
  • @AnindyaChatterjee 你找到解决方案了吗?
【解决方案2】:

gradle 罐子:

jar {
manifest{
    attributes "Agent-Class" : "com.......agent.AgentTest"
    //attributes "Premain-Class" : "com.......agent.AgentTest"
        }
    }

虽然,我习惯这样做:

    public static void main(String[] args) throws Exception {
    String pid = "6236";
    String agentPath = "...";
    VirtualMachine virtualMachine = com.sun.tools.attach.VirtualMachine.attach(pid);
    virtualmachine.loadAgent("/home/aaa/Code/agent-1.0-SNAPSHOT.jar");
    virtualMachine.detach();
}

【讨论】:

  • cf环境下运行应用程序时如何获取pid?我唯一的目标是在不同的 cf 环境中以可移植的方式运行它。
  • @AnindyaChatterjee 对不起,我不确定这个。也许你可以试试:build.gradle apply plugin: 'maven' 细节可能是 concult docs.gradle.org/current/userguide/maven_plugin.html
【解决方案3】:

你试过了吗

java -Xbootclasspath=('your path'/app.jar or 'your path to libs'/agent.jar) -javaagent:'your path'/app.jar -jar 'your path'/app.jar

?

另一种方法:使用 jar 作为依赖项并在 Spring Boot 应用程序 jar 中移动(或创建另一个)您的 premain 类。

【讨论】:

  • 这会将代理类放置在引导 jar 内的 BOOT-INF/classes 文件夹中,这又不能通过 -javaagent 参数访问。
  • 有趣,-Xbootclasspath (docs.oracle.com/cd/E15289_01/doc.40/e15062/optionx.htm#i1018570) 是一个不用于编译的选项,它用于运行 jar,所以我不明白它如何将 jar 文件复制到任何地方?为什么不直接将代理 jar 文件复制到根文件夹? stackoverflow.com/questions/8565863/….
  • 我没有说任何关于引导类路径的事情。我的意思是,当我使用 gradle build 创建一个 spring boot jar 时,它会将 premain 类放在 BOOT-INF/classes 文件夹中,并将代理 jar 放在 BOOT-INF/libs 文件夹中。您的命令行 arg 不适用于此引导 jar 布局。
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2018-10-30
  • 2020-06-11
  • 2015-06-04
  • 2020-11-10
  • 2019-06-11
相关资源
最近更新 更多