Как сделать программу запуска Eclipse, которая запускает Class - PullRequest
3 голосов
/ 07 декабря 2009

Я пытаюсь создать конфигурацию запуска Eclipse, которую я могу запускать программно, вроде создания собственного отладчика, если хотите.

У меня уже есть расширение org.eclipse.debug.core.launchConfigurationTypes, а также расширения .core.launchDelegates, .ui.launchConfigurationTabGroups и .core.sourcePathComputers.

У меня есть кнопка, которая выполняет следующий код:

ILaunchManager mgr = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfigurationType lct = mgr.getLaunchConfigurationType(IOpcodeConstants.LAUNCH_CFG_TYPE);
ILaunchConfiguration[] lcs = mgr.getLaunchConfigurations(lct);

for (int i = 0; i < lcs.length; ++i) {
     if (lcs[i].getName().equals("Opcode")) {
         lcs[i].delete();
         break;
     }
}

ILaunchConfigurationWorkingCopy wc = lct.newInstance(null, "Opcode");

Set<String> modes = new HashSet<String>();
modes.add(ILaunchManager.DEBUG_MODE);
wc.setModes(modes);
wc.setPreferredLaunchDelegate(modes, "nz.net.fantail.studio.OpcodeLaunchDelegate");

ILaunchConfiguration lc = wc.doSave();
lc.launch(ILaunchManager.DEBUG_MODE, null);

Мой делегат запуска имеет следующий код:

@Override
public void launch(ILaunchConfiguration configuration, String mode,
        ILaunch launch, IProgressMonitor monitor) throws CoreException {

    ManagementClient client = new ManagementClient("localhost", 6961);

    if (mode.equals(ILaunchManager.DEBUG_MODE)) {
        IDebugTarget target = new OpcodeDebugTarget(launch, client);
        launch.addDebugTarget(target);
    }
}

Все работает отлично, пока get не попытается загрузить класс ManagementClient и не выдаст исключение NoSuchClassDefException. Я подозреваю, что это потому, что он запускается в отдельной среде от реального приложения и поэтому не имеет .jar с классом в своем classpath.

Кто-нибудь знает, как обойти эту проблему? Ура!

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

Какой класс он не находит, ManagementClient или что-то еще? Возможно, в вашей конфигурации запуска вам нужно установить целевой classpath самостоятельно.

// customize the classpath
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, classPathList);

Вот некоторые другие настройки, которые могут быть полезны:

 wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, 
    projectName);
 wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, 
    targetMainClass);
 wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
    programArgs);
 wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, jvmArgs);
0 голосов
/ 07 декабря 2009

Зачем вам кнопка, запускающая конфигурацию? Если вы расширяете точки расширения, которые вы упомянули, ваша конфигурация запуска должна появиться в меню отладки eclipse ... нет необходимости в отдельной кнопке!?

Исходя из этого я бы присмотрел зависимости плагина, который содержит «ManagementClient». «NoSuchClassDefException» чаще всего является результатом неправильных определений зависимостей (может быть, порядок зависимостей неправильный [базовые плагины перед пользовательскими плагинами] ... или ваш класс вообще отсутствует в плагине?).

...