2012-05-03 2 views
2

Я пытался использовать classmexer в приложении RCP Eclipse, но я получил лишь IllegalStateException:Использовать classmexer в приложении RCP Eclipse?

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 classmexertester.ViewPart.createPartControl(ViewPart.java:22) 
at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:375) 
at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:229) 
at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595) 
at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:313) 
at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:534) 
at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180) 
at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270) 
at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65) 
at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473) 
at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1245) 
at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1198) 
at org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1597) 
at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:643) 
at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:570) 
at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:568) 
at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:272) 
at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:981) 
at org.eclipse.ui.internal.WorkbenchPage.onActivate(WorkbenchPage.java:2714) 
at org.eclipse.ui.internal.WorkbenchWindow$28.run(WorkbenchWindow.java:3030) 
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) 
at org.eclipse.ui.internal.WorkbenchWindow.setActivePage(WorkbenchWindow.java:3011) 
at org.eclipse.ui.internal.WorkbenchWindow.busyOpenPage(WorkbenchWindow.java:799) 
at org.eclipse.ui.internal.Workbench$23.runWithException(Workbench.java:1229) 
at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) 
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135) 
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757) 
at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803) 
at org.eclipse.ui.internal.Workbench$33.runWithException(Workbench.java:1600) 
at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) 
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:180) 
at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150) 
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4683) 
at org.eclipse.ui.internal.StartupThreading.runWithoutExceptions(StartupThreading.java:94) 
at org.eclipse.ui.internal.Workbench.init(Workbench.java:1595) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2628) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at classmexertester.Application.start(Application.java:20) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
at org.eclipse.equinox.launcher.Main.main(Main.java:1386) 

в конфигурации во время выполнения Я ставлю:

-javaagent: C:/Users/кД/рабочее пространство/ClassmexerTester /classmexer.jar

Может быть, я должен что-то добавить в plugin.xml?

ответ

3

в конфигурации во время выполнения Я ставлю:

-javaagent: C: /Users/kd/workspace/ClassmexerTester/classmexer.jar

Это не звучит правильно. Вы должны передать -javaagent:C:/Users/kd/workspace/ClassmexerTester/classmexer.jar как аргумент JVM. Вы указываете их в панели JM Arguments на вкладке «Запуск» вашей конфигурации продукта.

Вам также понадобится classmexer.jar в списке включенных баночек на панели путей к классам вкладки Runtime плагина plugin.xml.

+0

Я положил '-javaagent: C:/Users/kd/workspace/ClassmexerTester/classmexer.jar' как аргумент JVM и добавлю .jar в панель пути к классам plugin.xml. Но я все равно остаюсь тем же Исключением. Вот также MANIFEST.MF: 'Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: ClassmexerTester Bundle-SymbolicName: ClassmexerTester; синглтон: = True Bundle-Version: 1.0.0.qualifier Bundle-Activator: classmexertester.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime Bundle-ActivationPolicy: ленивый Bundle- RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ClassPath: classmexer.jar, .' – kj249

2

Я посмотрел на это немного больше и оказался в той же ситуации. Я не думаю, что есть простое решение, так как проблема связана с использованием OSGi framwework отдельными загрузчиками классов для загрузки пакетов. См. How can I use java.lang.instrument in an Eclipse RCP application?

Проблема - это экземпляр агента classmexer, который инициализирован -javaagent VM arg - это не тот экземпляр, который мы получаем в нашем плагине из-за разных загрузчиков классов в игре. Единственный способ решить эту проблему - это модифицировать класс агента либо использовать механизм совместного использования объектов System.properties, приведенный в приведенном выше примере, либо реализовать механизм Starting Agents After VM Startup и программно связать агента с вашим плагином. Оба подхода требуют изменения класса класса classmexer, поэтому они не являются незамедлительно жизнеспособными, поскольку источник не кажется открытым.

Однако вы можете воспользоваться EXCELENT инструментов профилирования приложения, доступных в Eclipse Test & Performance Tools Platform

+0

Благодарим вас за ответ. Я использую сейчас java.lang.instrument – kj249

+0

Я потратил много времени на воспроизведение вашей проблемы, исследуя основную причину и предлагая альтернативы. Вы даже не проявляете любезности, чтобы поддержать мой ответ, не принимая его. >: \ –

0

Следующий шаг сделал работу для меня. В Eclipse Java IDE перейдите в раздел «Закладка« Конфигурация-> «Аргументы» и введите «-javaagent: classmexer.jar» в разделе «Аргументы VM» и «Применить изменения». Убедитесь, что classmexer.jar включен в путь сборки Eclipse.

 Смежные вопросы

  • Нет связанных вопросов^_^