【问题标题】:Specify -javaagent Option in Manifest在清单中指定 -javaagent 选项
【发布时间】:2017-04-19 00:08:40
【问题描述】:

要告诉 JVM 在 Jar 文件的主类之前调用​​ Java Instrumentation 代理,您通常必须使用命令选项来调用它:

java -javaagent:agent.jar program.jar

每次都必须输入这个很不方便,那么有没有办法在 program.jar 清单中指定代理?

# program.jar/META-INF/MANIFEST.MF
...
Java-Agent: agent.jar

【问题讨论】:

  • this answer 的末尾是一个示例代码,它使用 Attach API 附加到自身,换句话说,将自身作为 Java 代理启动。它的主要目的是掌握Instrumentation 实现实例。如果这是你的目标,那么你已经完成了。如果您确定您的代码将包含在已经具有必要的 Agent-Class: 清单条目的 jar 文件中,则可以通过跳过虚拟 jar 文件的创建来简化该解决方案。

标签: java jar manifest instrumentation javaagents


【解决方案1】:

Java 9 添加了 Launcher-Agent-Class 属性,该属性可用于可执行 JAR 文件以在加载主类之前启动代理。

【讨论】:

    【解决方案2】:

    很遗憾,没有这样的选择。作为替代方案,您可以使用附加 API 动态附加 Java 代理。然而,这确实有一些限制,例如它通常只适用于与 JDK 一起分发的 JVM。

    有关附加代理的便捷 API,请查看 Byte Buddy Agent

    【讨论】:

    • 有没有办法在同一个Jar文件中指定一个代理Premain类,这样一开始我就没有多余的Jar了(即有agent.jar的内容在program.jar中)?
    • 是的,当然。您可以通过将 Premain-ClassMain-Class 标头添加到同一清单并运行 java -javaagent:program.jar program.jar 来组合 jar 文件。
    • 不幸的是,这仍然需要我输入-javaagent 选项:(
    • 这只能通过程序附件来避免。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多