我们正在开发一个java项目,我们使用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的正确方式,但我们不知道该怎么做。
谢谢你的帮助:)
我认为您可能成功地传递了JVM参数-您可以尝试使用-verbose
运行ant来确认。这个问题似乎与jar
属性的使用有关。
根据Ant java
任务文档(另见):
当您使用此选项时,JAR文件是所有用户的源文件类和其他用户类路径设置将被忽略。
因此,您必须确保classmerer .jar类包含在应用程序jar中才能找到它们。
还有一点:不推荐使用jvmargs
属性-您应该使用嵌套的jvmarg
元素。
您可能会考虑的一种方法是将您的应用程序jar添加到类路径中(以及classmerer .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>