簡體   English   中英

如何為Java代理指定類路徑

[英]how to specify class path for java agent

我正在編寫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 cvfm CnAgent.jar META-INF/MENIFIEST.MF . lib

當我使用JVM的Attach API加載代理時。 錯誤打印:

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

這意味着代理代碼無法找到javassist庫。

所以我的問題是:

  1. 如何設置代理庫的類路徑以使其能夠找到依賴項?

  2. 為什么MANIFEST.MF中的Class-Path選項不起作用,僅對jar直接在命令行中運行嗎?

謝謝你的智慧:)

您可以使用-Xbootclasspath:選項(設置路徑)或-Xbootclasspath / a:(將給定路徑追加到現有引導類路徑)(請參閱oracle中的doc )。 但是,如鏈接中所述,它是非標准的。

或者,您可以將丟失的jar文件復制到%JAVA_HOME%/ jre / lib / ext目錄中。

根據以上Guido的評論,您應該將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 jars復制到我從以下目錄運行命令的目錄: java -verbose:class -javaagent:poa.jar -jar ExampleProject.jar > loaded.txt

這也列出了所有已加載的類,以允許您調試Java類加載器實際上在做什么。

威士忌酒的任何一種選擇都不適合我的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM