2009-12-07 11 views
3

J'essaie de créer une configuration de lancement Eclipse que je peux lancer par programme, comme construire un débogueur personnalisé si vous le souhaitez.Comment faire un lanceur de débogage Eclipse qui lance une classe

J'ai déjà une extension org.eclipse.debug.core.launchConfigurationTypes, ainsi que les extensions .core.launchDelegates, .ui.launchConfigurationTabGroups et .core.sourcePathComputers.

J'ai un bouton qui exécute le code suivant:

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); 

Mon délégué de lancement a le code suivant:

@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); 
    } 
} 

Tout fonctionne parfaitement bien jusqu'à obtenir essaie de charger la classe ManagementClient et lance une exception NoSuchClassDefException. Je soupçonne que c'est parce qu'il se lance dans un environnement séparé de l'application réelle et en tant que tel n'a pas le .jar avec la classe dans son chemin de classe.

Est-ce que quelqu'un sait comment contourner ce problème? À votre santé!

Répondre

1

Quelle classe ne trouve-t-il pas, le ManagementClient ou autre chose? Peut-être que dans votre configuration de lancement, vous devez définir vous-même le classpath cible.

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

Voici quelques autres paramètres qui peuvent être utiles:

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

Hé, merci pour ça! C'est la classe ManagementClient qu'elle ne peut pas trouver. Cependant, je ne semble pas avoir IJavaLaunchConfigurationConstants - je jetterai un coup d'oeil dès que possible, probablement je n'ai pas son plugin dans le chemin source. À votre santé! –

0

Pourquoi avez-vous sur le bouton qui lance la configuration? Si vous étendez les points d'extension que vous avez mentionnés, votre configuration de lancement devrait apparaître dans le menu de débogage d'eclipse ... pas besoin d'un bouton séparé !?

En dehors de cela je voudrais s'occuper des dépendances du plugin qui contient "ManagementClient". Le "NoSuchClassDefException" est le plus souvent le résultat de définitions de dépendances erronées (peut-être l'ordre des dépendances est-il faux [core plugins before ui plugins] ... ou votre classe n'est pas dans un plugin tout à fait?).

+0

J'utilise un bouton séparé parce que je n'ai pas eu ou voulu un menu ou une barre d'outils dans cette interface utilisateur particulière. :-) Le plugin qui contient ManagementClient est OK, si je l'appelle à partir de l'application, il fonctionne correctement - c'est seulement quand il est appelé par le délégué de lancement quand il échoue ... –