我尝试将代理附加到程序。
我使用 _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
中。
如何在代理运行之前添加 javassist-3.26.0.GA.jar
?
最佳答案
这里出现问题的各种不同方式:
您应该避免这些环境变量。 java 背后的想法是你可以同时运行 8 个不同的应用程序。特别是在 Windows 上,环境变量是“全局”的;您可以为每个进程指定它们,尤其是在 UNIX 上,但是为什么不直接手动使用这些开关呢?此外,绝大多数教程等都假定您的默认类路径至少包括
.
(当前目录),您在这里的尝试覆盖了它,所以您这样做有点搞乱了您的java安装。为什么你不能直接运行java -cp whatever -javaagent:thingie.jar
有充分的理由吗? ?java 代理在 VM 内的单独空间中运行,并且该空间不会按照您指定的方式使用类路径。最简单的修复方法是让代理 jar 修复其自己的类路径,方法是附带列出其类路径的 list 条目。这意味着您需要一个名为
META-INF/MANIFEST.MF
的文件在代理 jar 里面,里面有一行文字:Boot-Class-Path: lib/a.jar lib/b.jar
其中 [1] 空格是分隔符,[2] 正斜杠用于分隔路径部分,即使在 Windows 上也是如此,[3] 它相对于包含此 jar 的目录。请注意,通常您会使用Class-Path:
对于 Java 应用程序;Boot-Class-Path
专门用于java代理。
参见section Manifest Attributes in Instrumentation's documentation了解更多详情。
关于java - _JAVA_OPTIONS 和 CLASSPATH 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856634/