Bonjour, une question très pointue !
je suis dessus depuis une semaine, j'ai retrourné le truc dans tous les sens , pas de résultat probant pour l'instant.
accrochez vous c'est assez long
but : je veux lancer une JVM en mode debug sous eclipse à parir d'un plugin
comment ?
ensuite il suffit de setter les bon attribut à l'objet wc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ILaunchConfigurationType configType = getLaunchManager() .getLaunchConfigurationType( IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION); ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, getLaunchManager().generateUniqueLaunchConfigurationNameFrom( "com.fortis.lu.wsad.tools.mains.MainGeneration"));
par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH,false); wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,fullClassPath);
ensuite il faut lancer le launch
cela fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ILaunchConfiguration config = wc.doSave(); /*ILaunch iLaunch =*/ config.launch(mode, progressMonitor);
mais
le problème vient du fait que mon class path est trop long pour java.
or le class path n'est pas une simple string dans notre cas, il s'agit d'une (List) de "memento"
un memento est une String xml définissant, disons, le descriptif d'un projet (ses bin, ses jars, ses lib etc...) à partir de ce xml-meento il déduit le class path sous forme de string , et là , c'esgt le drame "class path too long"
pour info, voici comment optenir la classe qui genere le memento : (méthode maison)
c'est à ce niveau que je coince : comme réduire le class path puisque ce n'est pas moi qui le génère mais eclipse...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 /** * Get classPath associated to the selected resource project * @param project The resource project * @return ArrayList[IRuntimeClasspathEntry] * @throws CoreException */ private static ArrayList getIRuntimeClasspathEntry(IProject project) throws CoreException { IJavaProject javaPrj = JavaCore.create(project); ArrayList classpathMemento = new ArrayList(); IRuntimeClasspathEntry[] iRuntimeClassPathEntry = JavaRuntime.computeUnresolvedRuntimeClasspath(javaPrj); for (int i = 0; i < iRuntimeClassPathEntry.length; i++) { //For WSAD5.1 need, only launch file wich contain good // classpath are launched ! (all resources in the classpath must // exist) //Check if archives present in classpath exist or not. if (iRuntimeClassPathEntry[i].getType() == IRuntimeClasspathEntry.ARCHIVE) { if (iRuntimeClassPathEntry[i].getResource() != null) { classpathMemento.add(iRuntimeClassPathEntry[i]); } else { System.out.println(project.getName() + " : " + iRuntimeClassPathEntry[i] + " == NOT EXIST"); } } else if (iRuntimeClassPathEntry[i].getType() == IRuntimeClasspathEntry.PROJECT) { //Check if java projects present in classpath exist or not. IProject p = (IProject) iRuntimeClassPathEntry[i].getResource(); //If it is, do not add it to classpath //Test if the project is accesible. //test if project is a java project nature. if ( p != null && p.isAccessible() && PluginsUtils.isJavaNatureOnly(p) ) { classpathMemento.add(iRuntimeClassPathEntry[i]); } } else { //No project classpath entry classpathMemento.add(iRuntimeClassPathEntry[i]); } } return classpathMemento; }
mon idée :
sachant que les jars ont dans leur manifest un class-path, j'ai essayé de faire un jar factice qui contient ce class path trop long, en le splitant sur plusieurs lignes comme trouvé sur le net... (par tranche de 68 chars)
j'arrive bien à dire à ma jvm d'utiliser le jar, et donc de trouver le main à l'intérrieur de ce jar. par contre un class.forName() d'une classe située dans un jar définie dans le class path du manifest ne fonctionne pas .... comme si le class-path dudit jar n'était pas chargé
je ne sais pas d'ou cela peut venir ?
hypothèses :
- le split en plusieurs ligne est incorrect : je n'y crois pas trop
- je ne sais pas si le chemin est en absolu ou en relatif dans un class path de manifest (selon les sites, j'ai pluseiurs réponses)
- comme le séparateur est " ", comment faire losrque le chemin en contient un ?
- dans le cas d'une chemin absolu si je note c:\toto, il n'en veut pas. donc j'ai mis "c:\toto" entre guillement... est ce la bonne notation ?
par ailleurs, il ne s'agit que d'une piste de travail, peut etre est ce ma manière d'appeller un launch Eclipse qui est moisie
si quelqu'un à une idée, ou ne serais-ce qu'une piste, je suis preneur.
merci d'avance.
JR
Partager