Leiningen 构建的 Java 代理在 Uberjar 中无法运行

4
在我的Leiningen项目中,我有以下配置:
:java-agents [[com.newrelic.agent.java/newrelic-agent "3.19.2"]]

当在lein repl中运行我的应用程序时,代理正在运行,但是当我创建uberjar并像下面这样运行它时:

java -jar target/proclodo-spa-server-rendering.jar

代理程序未启动。我可以在我的uberjar中包含newrelic-agent.jar并传递-javaagent参数,但我试图避免在我的存储库中具有不会自动升级的大型二进制文件(为什么New Relic甚至建议这样做?)。我尝试添加:

:bootclasspath true

由于这条评论:
;; Java agents can instrument and intercept certain VM features. Include
;; :bootclasspath true to place the agent jar on the bootstrap classpath.

但是这没有任何影响。代理jar包应该放置在CLASSPATH中,这样我就可以验证它是否正常工作了。
我正在使用Jetty,据说会干扰bootclasspath,但我不确定它应该如何干扰。一切似乎都运行正常,只有代理没有启动。
1个回答

0

如果您自己运行Java,则必须自己传递VM选项,例如要使用的调试代理。Lein无法将其打包到jar中:根本没有机制可以这样做。


那么,:bootclasspath 是什么作用呢?这个 jar 包似乎不在我的超级 jar 包中。我如何传递参数而不将 jar 包放入我的 repo 中?这是不好的。 - pupeno
@Pablo 这实际上是两个新问题,而不是这个问题的后续。但简单来说:一旦你使用leiningen构建了一个jar,你就有了一个像任何其他基于java的jar一样的jar,你可以查找如何在运行jar时设置代理;它不再是特定于clojure的。如果你想在部署环境中使用代理,你需要安排代理jar存在那里,并安排传递java-agent参数。 - amalloy
例如,由于您使用New Relic,https://docs.newrelic.com/docs/agents/java-agent/installation/java-agent-manual-installation似乎是一个非常详细的解释,说明如何在运行jar时使用它。 - amalloy
从Leiningen文档中可以看到,它说:将bootclasspath设置为true应该会将代理jar放置在类路径上,我理解错了吗?你是说这必须手动完成。那么Leiningen文档是错误的吗? - pupeno
我看了一下New Relic的文档,它建议将一个JAR文件放在你的版本控制树中,这太糟糕了。这是一个大的二进制文件,而不是源代码,仅仅通过复制到那里就已经脱离了我的构建系统,所以除非我明确地记得检查更新,否则它不会得到更新。 - pupeno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接