[英]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庫。
所以我的問題是:
如何設置代理庫的類路徑以使其能夠找到依賴項?
為什么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.