[JVM-debug] [plugin] classpath trop long
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 ?
Code:
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")); |
ensuite il suffit de setter les bon attribut à l'objet wc
par exemple :
Code:
1 2 3 4
|
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH,false);
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,fullClassPath); |
ensuite il faut lancer le launch
Code:
1 2 3
|
ILaunchConfiguration config = wc.doSave();
/*ILaunch iLaunch =*/ config.launch(mode, progressMonitor); |
cela fonctionne.
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-memento il déduit le class path sous forme de string , et là , c'esgt le drame "class path too long"
pour info, voici comment obtenir la classe qui genere le memento : (méthode maison)
Code:
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;
} |
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...
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