2011-08-06 27 views
1

我們正在開發一個java項目,我們使用ant來構建和運行程序。現在我們正在進行一些性能測試,我們想使用classmexer。問題是我們不能讓螞蟻和班級成員一起工作。使classmexer和ant一起工作

因爲它是必要的傳遞給JVM的參數

-javaagent:classmexer.jar 

我們試圖在我們的build.xml

<target name="run" description="Try running it." depends="all"> 
    <java jvmargs="-javaagent:classmexer.jar" jar="${OUT_DIR}/${FILE_NAME}.jar" failonerror="true" fork="true"> 
    </java> 
</target> 

,但它不工作如下。 在運行該程序引發以下異常

java.lang.IllegalStateException: Agent not initted 
      at com.javamex.classmexer.Agent.getInstrumentation(Agent.java:33) 
      at com.javamex.classmexer.MemoryUtil.deepMemoryUsageOf(MemoryUtil.java:104) 
      at com.javamex.classmexer.MemoryUtil.deepMemoryUsageOf(MemoryUtil.java:80) 
      at output_archive.test.provaJDOM.main(provaJDOM.java:55) 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
      at java.lang.reflect.Method.invoke(Method.java:616) 
      at com.sun.star.lib.loader.Loader.main(Loader.java:141) 

MemoryUtil.deepMemoryUsageOf(Object)被稱爲

如此看來,這不是傳遞參數給JVM正確的方式,但我們無法弄清楚什麼去做。

謝謝你的幫助:)

回答

1

我想你也許經過JVM ARG成功 - 你可以嘗試運行ant與-verbose確認。使用jar屬性似乎可能是問題所在。

根據螞蟻java task docssee also):

當您使用此選項,JAR文件是所有用戶 類的源,和其他用戶類路徑設置將被忽略。

因此,您必須確保classmexer.jar類包含在應用程序jar中以供找到它們。

另一點:jvmargs屬性已棄用 - 您應該使用嵌套的jvmarg元素。

你可以考慮的方法是將應用程序的jar添加到類路徑(與classmexer.jar一起)和罐子裏直接指定的清單調用主類。這樣的事情:

<java classname="...YourMainClass" failonerror="true" fork="true"> 
    <jvmarg value="-javaagent:classmexer.jar" /> 
    <classpath> 
     <!-- other stuff here maybe --> 
     <pathelement location="path_to_classmexer/classmexer.jar" /> 
     <pathelement location="${OUT_DIR}/${FILE_NAME}.jar" /> 
    </classpath> 
</java> 
+0

謝謝你的清晰評論的答案。但它還沒有工作。也許一些奇怪的與OpenOffice的發生......該項目是有關編寫一個OpenOffice延伸,所以我們的代碼是由OpenOffice的自身加載,也許它忽略傳遞給JVM的參數和具有(希望)另一種方式來解決這個問題。 無論如何,非常感謝你:-) –