Сделайте так, чтобы classmexer и ant работали вместе - PullRequest
1 голос
/ 06 августа 2011

Мы работаем над 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, но мы можемне разбираюсь что делать.

Спасибо за помощь:)

1 Ответ

1 голос
/ 06 августа 2011

Я думаю, вы, вероятно, успешно передаете аргумент JVM - вы можете попробовать запустить ant с -verbose для подтверждения. Вполне вероятно, что проблема связана с использованием атрибута jar.

В соответствии с Ant java документация по заданию ( см. Также ):

Когда вы используете эту опцию, файл JAR является источником всех пользователей классы и другие параметры пути к классам пользователей игнорируются.

Итак, вам нужно убедиться, что классы classmexer.jar включены в jar приложения, чтобы их можно было найти.

Еще один момент: атрибут jvmargs устарел - вместо него следует использовать вложенный элемент jvmarg.

Подход, который вы могли бы рассмотреть, - добавить jar приложения в classpath (вместе с 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>
...