我们正在开发一个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的正确方法,但我们无法弄清楚要做什么。
感谢您的帮助:)
答案 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>