我有一个 Java 代理,我想让它为主机上运行的任何任意 Java 进程自动启用。
我不能依赖别名或环境变量(如等) PATH
,JVM_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 发行版的支持,因此不建议使用。