如何为主机上的每个新 Java 进程启用 Java 代理?

如何为主机上的每个新 Java 进程启用 Java 代理?

我有一个 Java 代理,我想让它为主机上运行的任何任意 Java 进程自动启用。

我不能依赖别名或环境变量(如等) PATHJVM_OPTS因为我希望任何 JVM 进程都能选择代理,即使直接作为运行/usr/bin/java -jar my-app.jar

一种(相当肮脏的)方法是java用我的自定义 bash 脚本物理替换二进制文件,如下所示:

#!/bin/bash 
$(dirname "$0")/java.original "-javaagent:path/to/my-agent.jar" "$@"

它可以工作,但是该方法需要重命名原始java二进制文件,而我想避免这样做。

问题: 有没有更好的方法可以在不触碰java二进制文件的情况下实现相同的行为?是否有任何全局的 Java 特定配置文件,我可以在其中指示 Java总是与给定的代理一起运行?

答案1

有一个环境变量,可以为所有用户JAVA_TOOL_OPTIONS设置。/etc/profile.d

export JAVA_TOOL_OPTIONS=-javaagent:path/to/my-agent.jar

每个 Java 进程都将拾取它,无论它以何种方式启动。

来自官方文档

-agentlib此环境变量允许您指定工具的初始化,特别是使用或选项启动本机或 Java 编程语言代理-javaagent。在以下示例中,设置环境变量,以便在启动应用程序时启动 HPROF 分析器:

$ export JAVA_TOOL_OPTIONS="-agentlib:hprof"

此变量还可用于为命令行添加其他选项以用于诊断目的。例如,您可以提供 -XX:OnError 选项来指定在发生致命错误时要执行的脚本或命令。

还有一个未记录的_JAVA_OPTIONS变量优先于JAVA_TOOL_OPTIONS命令行参数,在某些情况下可能很方便。但由于它已被弃用,并且可能不受所有 Java 发行版的支持,因此不建议使用。

相关内容