【问题标题】:how to specify class path for java agent如何为java代理指定类路径
【发布时间】:2018-12-04 00:26:23
【问题描述】:

我正在编写一个 Java 代理来检测目标类的目标方法。

我使用 javassist 库来做仪器。

所以 java 代理(让命名为 CnAgent.class)需要它的依赖项:javassist 库才能运行。

目录层次结构是:

.
├── META-INF
│   └── MANIFEST.MF
├── com
│   └── yet
│       └── another
│           └── test
│               └── agent
│                   ├── CnAgent.class
│                   └── CnTransformer.class
└── lib
    └── javassist-3.18.2-GA.jar

MANIFEST.MF 文件内容为:

Manifest-Version: 1.0
Class-Path: lib/javassist-3.18.2-GA.jar .
Agent-Class: com.yet.another.test.agent.CnAgent
Created-By: 1.8.0_11 (Oracle Corporation)
Can-Retransform-Classes: true

我通过以下命令创建 jar 球:

jar cvfm CnAgent.jar META-INF/MENIFIEST.MF . lib

当我使用 JVM 的附加 API 加载代理时。 错误打印:

error when transform : javassist/ClassPool
java.lang.NoClassDefFoundError: javassist/ClassPool

这意味着代理代码找不到 javassist 库。

所以我的问题是:

  1. 如何设置代理库的类路径,让它找到依赖关系?

  2. 为什么 MANIFEST.MF 中的 Class-Path 选项不起作用,它只适用于直接在命令行中运行的 jar 吗?

感谢你的智慧:)

【问题讨论】:

  • 尝试使用Boot-Class-Path 代替Class-Path(不带点.)。
  • 警告:javassist-3.18.2-GA.jar 未添加到引导类加载器搜索:非法参数或不是 JAR 文件

标签: java jvm jvm-hotspot


【解决方案1】:

您可以使用选项 -Xbootclasspath:(设置路径)或 -Xbootclasspath/a:(将给定路径附加到现有引导类路径)(请参阅doc from oracle)。但是,如链接中所述,它是非标准的。

作为替代方法,您可以将丢失的 jar 文件复制到 %JAVA_HOME%/jre/lib/ext 目录中。

【讨论】:

    【解决方案2】:

    根据上面的Guido's 评论,您应该将Boot-Class-Path 添加到您的代理MANIFEST.MF

    请参阅这些 java.lang.instrumentation 文档(清单属性部分)

    就我而言,我在 Ant 的 build.xml 中有这个:

        <manifest file="META-INF/MANIFEST.MF">
           <attribute name="Premain-Class" value="de.bodden.tamiflex.playout.Agent"/>
           <attribute name="Main-Class" value="de.bodden.tamiflex.playout.Agent"/>
           <attribute name="Can-Retransform-Classes" value="true"/>
           <attribute name="Implementation-Version" value="${tf.version}"/>
           <attribute name="Boot-Class-Path" value="guava-22.0.jar:guice-4.1.0.jar" />
       </manifest>
    

    然后将 guice 和 guava jar 复制到我运行命令的目录,例如java -verbose:class -javaagent:poa.jar -jar ExampleProject.jar &gt; loaded.txt

    这还列出了所有加载的类,以便您调试 Java 类加载器实际在做什么。

    whiskeyspider 的两个选项都不适用于我的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多