IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Java Discussion :

[JVM-debug] [plugin] classpath trop long


Sujet :

Eclipse Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut [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 : 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"));
    ensuite il suffit de setter les bon attribut à l'objet wc
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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;
    	}
    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

  2. #2
    Membre éprouvé Avatar de Tazmanian Devil
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut
    C'est quand même bizarre, il faut que tu ais un sacré nombre de jar avant que ca péte, ou alors des chemins à rallonge de windows.

    Pour info, je fais la même chose dans un de mes plugins pour lancer une appli externe, donc ta manière ne semble pas moisie. (D'ailleurs j'en vois pas d'autre ), ceci dit je n'ai jamais réussi à obtenir un classpath trop long.

    Pour tes chemins dans le manifest, utilise les / et pas les \, ainsi que les chemins en relatif de préférence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    exemple tiré du manifest du serveur OC4J :
    Class-Path: lib/ejb.jar lib/servlet.jar lib/ojsp.jar lib/jndi.jar lib/
     jdbc.jar iiop.jar  iiop_gen_bin.jar lib/jms.jar lib/jta.jar lib/jmxri
     .jar lib/javax77.jar lib/javax88.jar  ../../opmn/lib/ons.jar ../../op
     mn/lib/optic.jar ../../lib/dms.jar ../../dms/lib/dms.jar ...etc.......

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut
    J'ai fini par trouver une soltuion dégeu, grace à l'aide de natha...

    je créer un wc temporaire avec tout le class path, je l'utilise pour créer un fichier de config avec le class path en entier.

    puis je m'en débarasse pour un autre ne contenante que le memento d'un seul projet dont je maitrise la taille de class path.

    dans ce projet : je rajoute un MainDispatcher dont le but est de charger la config puis de lancer le véritable Main.

    je rajoute deux arguments à un MainDispatcher : un pour le Main-réel, un pour le fichier de config.
    1- je force le class path à partir du fichier de conf.
    2- ja lance le main par ClassforName() sur mon main réel !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public static void main(String[] args) {
    		try {
    			String classpathFile = args[args.length-1];
    			addURLfromConfig(classpathFile);
     
    			String clazz = args[args.length-2];
    			Class.forName(clazz).getMethod("main",new Class[]{args.getClass()}).invoke(null,new Object[]{args});
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    la methode addURLFromconfig() récupère le classpath ligne par ligne, et avec un accès sauvage à la méthode addURL() du ClassLoader.getDefault() (qui est protected ...) on peut modifier le classpath en live...

    c'est assez sale, mais cela a le mérite de fonctionner


    jrf
    (je ne resolve pas tout de suite, si jamais quelqu'un a une idée supplémentaire !)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/05/2011, 16h40
  2. Réponses: 4
    Dernier message: 26/11/2010, 09h23
  3. Problème de clean avec des chemins trop longs des plugins
    Par obrun dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/03/2010, 13h26
  4. Réponses: 6
    Dernier message: 17/04/2007, 15h03
  5. [JAR][Manifest] classpath trop long
    Par zolive dans le forum Général Java
    Réponses: 5
    Dernier message: 22/03/2007, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo