_JAVA_OPTIONS 和 CLASSPATH 组合

_JAVA_OPTIONS and CLASSPATH combination

我尝试将代理附加到程序。

我将 _JAVA_OPTIONS 用于以下情况:

export _JAVA_OPTIONS='-javaagent:/java/libs/doeke_sfjl_ui/sfjl_ui_widget_agent.jar'

但是它需要一个 jar 文件才能 运行。 我尝试使用以下方法解决该问题:

export CLASSPATH=/java/libs/javassist-3.26.0.GA/javassist-3.26.0.GA.jar

但我仍然得到:

ClassNotFoundException: javassist.expr.ExprEditor

住在javassist-3.26.0.GA.jar

如何在代理 运行ning 之前添加 javassist-3.26.0.GA.jar

此处出现问题的方式多种多样:

  1. 您应该避免使用这些环境变量。 java 背后的想法是您可以同时 运行 8 个不同的应用程序。特别是在 windows 上,环境变量是 'global';您可以为每个进程指定它们,尤其是在 unix 上,但是为什么不手动使用这些开关呢?此外,绝大多数教程等都假定您的默认类路径至少包括 .(当前目录),您在此处的尝试覆盖了它,所以您有点搞砸了您的 java通过这样做安装。为什么你不能 运行 java -cp whatever -javaagent:thingie.jar

  2. java 代理 运行 在单独的 space VM 中,并且 space 没有像您指定的那样享受类路径它。最简单的解决方法是让代理 jar 修复它自己的类路径,方法是附带一个列出其 Class-Path 的清单条目。这意味着您需要在代理 jar 中有一个名为 META-INF/MANIFEST.MF 的文件,里面是一行文本:Boot-Class-Path: lib/a.jar lib/b.jar 其中 [1] space 是分隔符,[2] 正斜杠是用于分隔路径部分,即使在 windows 上也是如此,并且 [3] 它是相对于包含此 jar 的目录的。请注意,通常您会为 java 应用程序使用 Class-Path:Boot-Class-Path 专门针对 java 代理人。

有关详细信息,请参阅 section Manifest Attributes in Instrumentation's documentation