让classmexer和ant一起工作

时间:2011-08-06 11:08:48

标签: java ant profiling memory-management

我们正在开发一个java项目,我们使用ant来构建和运行该程序。现在我们正在进行一些性能测试,我们想使用classmexer。问题是我们不能让ant和classmexer一起工作。

因为有必要将参数

传递给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 个答案:

答案 0 :(得分:1)

我认为您可能 成功传递了JVM arg - 您可以尝试使用-verbose运行ant来确认。似乎问题可能是使用jar属性。

根据Ant java task docs see also ):

  

使用此选项时,JAR文件是所有用户的来源   类和其他用户类路径设置将被忽略。

因此,您必须确保将classmexer.jar类包含在应用程序jar中,以便找到它们。

另一点:不推荐使用jvmargs属性 - 您应该使用嵌套的jvmarg元素。

您可能考虑的方法是将应用程序jar添加到类路径(以及classmexer.jar)并直接调用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>