[jar][classpath][eclipse 3.0] memento de class path 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
Code:
1 2 3 4
|
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH,false);
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,fullClassPath); |
par exemple
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-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)
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
vrai et faux : raccourci verbal abusif :
Le message exact est "The input line is too long."
Ce qui est une limitation de windows, j'en conviens.
Par ailleurs dans un jar, il faut mettre un retour à la ligne à chaque 70è caractère, sinon lors de la "jarisation", on obtient cette exception :
"java.io.IOException: line too long"
Pour tester c'est simple il suffit de faire un projet qui tourne et ensuite de rajouter dans le class path tout un tas de lib inutiles... résultat garanti sous windows (autres environnement, je ne sais pas)
-----
A ce problème, sur le net, j'ai vu une proposition de mettre dans un jar le class path (puisqu'on peu le splitter par tranche de 68 chars).
d'où mes intérogations....
Je suppose que cela fonctionne dans certains cas, notamment un jar exécutable, mais mon cas est vraiment (n'ayons pas peur des mots) pourri, puisque je ne lance pas une application java : je lance un objet ILaunchConfiguration d'eclipse... (ceci dit, nonobstant ce détail, le problème reste le meme)
si je fais cette stratégie, c'est à dire mettre une classe Main dans un jar, et un classpath dans le manifest de ce dernier, le class path du jar n'est pas intégré à mon ClassLoader : "java.lang.ClassNotFoundException:" sur un simple Class.ForName() dans le Main.
JRF