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

JWS Java Discussion :

Problème avec JNLP ?


Sujet :

JWS Java

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut Problème avec JNLP ?
    Bonjour

    Voici mon problème. Je veux permettre une utilisation de mon code via Java web start.
    Voici mon code JNLP :
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <!-- JNLP File -->
     
    <jnlp spec="1.0+"
          codebase="http://xxx.xxx.xxx.xxx/~gldavid/Prog/" 
          href="prog.jnlp">
       <information>
          <title>Demo</title>
          <vendor>GLDavid</vendor>
          <description>Demo</description>
          <homepage href="https://xxx.xxx.xxx.xxx/~gldavid/Prog/index.html"/>
          <description kind="short">Prediction</description>
          <offline-allowed/>
       </information>
    	<security>
       		<all-permissions/>
    	</security> 
       <resources>     
       	<jar href="ProgJWS.jar"/>   
       	<jar href="Pluginnable.jar"/>
    	<j2se version="1.5+"
    	      href="http://java.sun.com/products/autodl/j2se"/>
       </resources>
       <application-desc main-class="com.gldavid.gui.Main"/>
    </jnlp>
    Or, lors de l'exécution, j'ai toujours l'erreur suivante :
    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
     
    java.lang.reflect.InvocationTargetException
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at com.sun.javaws.Launcher.executeApplication(Launcher.java:1205)
    	at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1151)
    	at com.sun.javaws.Launcher.doLaunchApp(Launcher.java:998)
    	at com.sun.javaws.Launcher.run(Launcher.java:105)
    	at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.NoClassDefFoundError: com/bioxpr/interfaces/Activable
    	at java.lang.ClassLoader.defineClass1(Native Method)
    	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
    	at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
    	at com.bioxpr.loader.MultiClassLoader.loadClass(MultiClassLoader.java:75)
    	at com.bioxpr.loader.Test.loadClass(Test.java:16)
    	at com.bioxpr.gui.PluginsList.scanning(PluginsList.java:110)
    	at com.bioxpr.gui.PluginsList.<init>(PluginsList.java:41)
    	at com.bioxpr.gui.MainWindow.Scan(MainWindow.java:140)
    	at com.bioxpr.gui.BioXpress.main(BioXpress.java:42)
    	... 9 more
    Si je comprends bien, il ne trouve pas mon interface Activable qui est comprise dans le 2ème jar Pluginnable. Or, ce jar est bien présent et signé.
    Que se passe t'il donc ?
    Merci d'avance de vos réponses.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bon, j'ai un peu cherché.
    J'ai mis toutes les classes de mon Jar annexe dans le Jar principal. A l'exécution, en stand-alone, pas de problème, tout s'exécute correctement. En revanche, via Java Web Start, rebelote, j'ai encore le même problème que cité plus haut.
    Conclusion : ce n'est pas un problème de Jar.
    A un certain moment, j'ai recours à un chargement de classes via un ClassLoader. Est-ce que cela pose un problème pour java Web Start ?

    Merci d'avance de vos réponses.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par GLDavid
    A un certain moment, j'ai recours à un chargement de classes via un ClassLoader. Est-ce que cela pose un problème pour java Web Start ?
    C'est possible... comment fais-tu ce chargement ?

    a++

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    A mon avis, le problème vient peut être du plugin en lui-même, adi.
    Il faut que je vérifie cette hypothèse, sinon, je répondrais à ton post

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Je ne suis plus sûr mais il me semble bien que le SystemClassLoader est différent en JWS par rapport à une application 'normale' :

    • Lorsque tu lances une application 'normale', le SystemClassLoader correspond aux éléments de ton CLASSPATH, et donc généralement tes jars.
    • Par contre lorsque tu lances une application JWS, le SystemClassLoader correspondant généralement aux classes spécifiques de JWS (package javaws.jnlp), et le ClassLoader correspondant à tes fichiers jars est un classloader fils...


    Du coup, dans une application normale, le SystemClassLoader peut voir les classes de ton applications, alors que ce n'est pas le cas dans une application JWS...

    Il faut récupérer le ClassLoader d'une de tes classes du programme...

    a++

  6. #6
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut adi

    Merci de tes riches informations.
    Voici comment je procède en stand-alone (et donc en JWS).
    A un moment, j'ai ces deux fonctions :
    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
     
    public void scanning() throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException{
    		for(String s : this.returned){
    			String dir = "/home/gldavid/public_html/Prog/Plugins/"+s+"/Jar/";
    			File directory = new File(dir);
    			File[]jars = directory.listFiles();
    			String classe = readJarproperty(jars[0]);
    			Object o = Test.loadClass(jars[0].getAbsolutePath(), classe);
    			plugins.add(o);
    		}
    	}
     
    	public Vector<String>scan() {
    		String dir = "/home/gldavid/public_html/Prog/Plugins";
    		String name = "file://"+dir;
    		File repertory = null;
    		try{
    			repertory = new java.io.File(new java.net.URI(name));
    		}
    		catch(java.net.URISyntaxException urise){
    			JOptionPane.showMessageDialog(BioXpress.mw, urise.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
    		}
    		File[] files = repertory.listFiles();
    		Vector<String>zips = new Vector<String>();
    		for(File f : files){
    			if(f.isDirectory())
    				zips.add(f.getName());
    		}
    		return zips;
    	}
    J'appelle la méthode Test.loadClass() :
    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
     
    /*
     * Internal Testing application.
     */
    public class Test
    {
     
    	public static Object loadClass(String jarPath, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException{
    		/*
    		 * Create the jar class loader and use the first argument
    		 * passed in from the command line as the jar file to use.
    		 */
    		JarClassLoader jarLoader = new JarClassLoader(jarPath);
    		/* Load the class from the jar file and resolve it. */
    		Class c = jarLoader.loadClass(className, true);
    		/*
    		 * Create an instance of the class.
    		 *
    		 * Note that created object's constructor-taking-no-arguments
    		 * will be called as part of the object's creation.
    		 */
    		Object o = c.newInstance();
    		return o;
    	}
     
    }
    Et voici la classe JarClassLoader :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    package com.bioxpr.loader;
     
    public class JarClassLoader extends MultiClassLoader
    {
    	private JarResources    jarResources;
    	public JarClassLoader (String jarName)
    	{
    //		Create the JarResource and suck in the jar file.
    		jarResources = new JarResources (jarName);
    	}
     
    	protected byte[] loadClassBytes (String className)
    	{
    //		Support the MultiClassLoader's class name munging facility.
    		className = formatClassName (className);
    //		Attempt to get the class data from the JarResource.
    		return (jarResources.getResource (className));
    	}
    }
     
    package com.bioxpr.loader;
     
    import java.util.Hashtable;
     
     
    /**
     * A simple test class loader capable of loading from
     * multiple sources, such as local files or a URL.
     *
     * This class is derived from an article by Chuck McManis
     * http://www.javaworld.com/javaworld/jw-10-1996/indepth.src.html
     * with large modifications.
     *
     * Note that this has been updated to use the non-deprecated version of
     * defineClass() -- JDM.
     *
     * @author Jack Harich - 8/18/97
     * @author John D. Mitchell - 99.03.04
     */
    public abstract class MultiClassLoader extends ClassLoader {
     
    //	---------- Fields --------------------------------------
    	private Hashtable classes = new Hashtable();
    	private char      classNameReplacementChar;
     
    	protected boolean   monitorOn = false;
    	protected boolean   sourceMonitorOn = true;
     
    //	---------- Initialization ------------------------------
    	public MultiClassLoader() {
    	}
    //	---------- Superclass Overrides ------------------------
    	/**
             * This is a simple version for external clients since they
             * will always want the class resolved before it is returned
             * to them.
             */
    	@SuppressWarnings("unchecked")
    	public Class loadClass(String className) throws ClassNotFoundException {
    		return (loadClass(className, true));
    	}
    //	---------- Abstract Implementation ---------------------
    	@SuppressWarnings("unchecked")
    	public synchronized Class loadClass(String className,
    			boolean resolveIt) throws ClassNotFoundException {
     
    		Class   result;
    		byte[]  classBytes;
    		monitor(">> MultiClassLoader.loadClass(" + className + ", " + resolveIt + ")");
     
    		//----- Check our local cache of classes
    		result = (Class)classes.get(className);
    		if (result != null) {
    			monitor(">> returning cached result.");
    			return result;
    		}
     
    		//----- Check with the primordial class loader
    		try {
    			result = super.findSystemClass(className);
    			monitor(">> returning system class (in CLASSPATH).");
    			return result;
    		} catch (ClassNotFoundException e) {
    			monitor(">> Not a system class.");
    		}
     
    		//----- Try to load it from preferred source
    		// Note loadClassBytes() is an abstract method
    		classBytes = loadClassBytes(className);
    		if (classBytes == null) {
    			throw new ClassNotFoundException();
    		}
     
    		//----- Define it (parse the class file)
    		result = defineClass(className, classBytes, 0, classBytes.length);
    		if (result == null) {
    			throw new ClassFormatError();
    		}
     
    		//----- Resolve if necessary
    		if (resolveIt) resolveClass(result);
     
    		// Done
    		classes.put(className, result);
    		monitor(">> Returning newly loaded class.");
    		return result;
    	}
    //	---------- Public Methods ------------------------------
    	/**
             * This optional call allows a class name such as
             * "COM.test.Hello" to be changed to "COM_test_Hello",
             * which is useful for storing classes from different
             * packages in the same retrival directory.
             * In the above example the char would be '_'.
             */
    	public void setClassNameReplacementChar(char replacement) {
    		classNameReplacementChar = replacement;
    	}
    //	---------- Protected Methods ---------------------------
    	protected abstract byte[] loadClassBytes(String className);
     
    	protected String formatClassName(String className) {
    		if (classNameReplacementChar == '\u0000') {
    			// '/' is used to map the package to the path
    			return className.replace('.', '/') + ".class";
    		} else {
    			// Replace '.' with custom char, such as '_'
    			return className.replace('.',
    					classNameReplacementChar) + ".class";
    		}
    	}
    	protected void monitor(String text) {
    		if (monitorOn) print(text);
    	}
    //	--- Std
    	protected static void print(String text) {
    		System.out.println(text);
    	}
     
    } // End class
    Ainsi, est-ce que le problème viendrait de là ? J'en ai bien l'impression.
    A un moment, je croyais que ça venait tout simplement parce que je passe des paths en durs, mais peut être que ce n'est pas ça. Ton avis expert m'intéresserait.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GLDavid
    Ainsi, est-ce que le problème viendrait de là ? J'en ai bien l'impression.
    Je pense que oui.

    Comme tu ne définit pas de ClassLoader parent dans tes classes qui héritent de ClassLoader, tu utilises implicitement le SystemClassLoader comme parent (voir la doc du constructeur de ClassLoader()).


    Cela marche très bien lorsque tu es en 'local' car tu as une arborescence comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ClasseLoader de base (classes standard + extensions)
    |
    +--> SystemClassLoader (fichiers JARs du CLASSPATH)
         |
         +--> JarClassLoader
    du coup, lorsque ton JarClassLoader tente de chercher une classe de tes Jars principaux, il arrive à les trouver car elles sont défini dans le ClassLoader parent (cette recherche dans le parent est automatique).


    Maintenant, lorsque tu lances via JWS, ton arborescence de ClassLoader est dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ClasseLoader de base (classes standard + extensions)
    |
    +--> SystemClassLoader (classes jnlp)
         |
         +--> ClassLoader JNLP (fichiers JARs du fichier JNLP)
         |
         +--> JarClassLoader
    Du coup, ton JarClassLoader n'a pas accès aux classes de tes jars, car elles ne se trouvent pas dans le ClassLoader parent mais dans un ClassLoader "frère" totalement invisible pour lui !


    Il te faudrait une arborescence dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ClasseLoader de base (classes standard + extensions)
    |
    +--> SystemClassLoader (classes jnlp)
         |
         +--> ClassLoader JNLP (fichiers JARs du fichier JNLP)
               |
               +--> JarClassLoader
    Pour cela il faut appeler le constructeur ClassLoader(ClassLoader) dans ta classe JarClassLoader et/ou MultiClassLoader afin de spécifier le ClassLoader parent à utiliser...

    Par exemple si MultiClassLoader se trouve bien dans les jars de ton application, il suffirait de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public abstract class MultiClassLoader extends ClassLoader {
     
    	public MultiClassLoader() {
    		super(MultiClassLoader.class.getClassLoader());
    	}
     
    ...
    a++

  8. #8
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut adi

    Merci de ta réponse vraiment très enrichissante !
    Mais hélas, le problème n'est pas totalement résolu.
    J'ai fait les modifications suivantes en tenant compte de tes remarques :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    public class JarClassLoader extends MultiClassLoader
    {
    	private JarResources    jarResources;
    	public JarClassLoader (String jarName)
    	{
    		super(JarClassLoader.class.getClassLoader());
    //		Create the JarResource and suck in the jar file.
    		jarResources = new JarResources (jarName);
    	}
     
    	protected byte[] loadClassBytes (String className)
    	{
    //		Support the MultiClassLoader's class name munging facility.
    		className = formatClassName (className);
    //		Attempt to get the class data from the JarResource.
    		return (jarResources.getResource (className));
    	}
    }
     
    package com.bioxpr.loader;
     
    import java.util.Hashtable;
     
     
    /**
     * A simple test class loader capable of loading from
     * multiple sources, such as local files or a URL.
     *
     * This class is derived from an article by Chuck McManis
     * http://www.javaworld.com/javaworld/jw-10-1996/indepth.src.html
     * with large modifications.
     *
     * Note that this has been updated to use the non-deprecated version of
     * defineClass() -- JDM.
     *
     * @author Jack Harich - 8/18/97
     * @author John D. Mitchell - 99.03.04
     */
    public abstract class MultiClassLoader extends ClassLoader {
     
    //	---------- Fields --------------------------------------
    	private Hashtable classes = new Hashtable();
    	private char      classNameReplacementChar;
     
    	protected boolean   monitorOn = false;
    	protected boolean   sourceMonitorOn = true;
     
    //	---------- Initialization ------------------------------
    	public MultiClassLoader() {
    	}
     
    	public MultiClassLoader(ClassLoader cl) {
    		super(MultiClassLoader.class.getClassLoader());
    	}
    //	---------- Superclass Overrides ------------------------
    	/**
             * This is a simple version for external clients since they
             * will always want the class resolved before it is returned
             * to them.
             */
    	@SuppressWarnings("unchecked")
    	public Class loadClass(String className) throws ClassNotFoundException {
    		return (loadClass(className, true));
    	}
    //	---------- Abstract Implementation ---------------------
    	@SuppressWarnings("unchecked")
    	public synchronized Class loadClass(String className,
    			boolean resolveIt) throws ClassNotFoundException {
     
    		Class   result;
    		byte[]  classBytes;
    		monitor(">> MultiClassLoader.loadClass(" + className + ", " + resolveIt + ")");
     
    		//----- Check our local cache of classes
    		result = (Class)classes.get(className);
    		if (result != null) {
    			monitor(">> returning cached result.");
    			return result;
    		}
     
    		//----- Check with the primordial class loader
    		try {
    			result = super.findSystemClass(className);
    			monitor(">> returning system class (in CLASSPATH).");
    			return result;
    		} catch (ClassNotFoundException e) {
    			monitor(">> Not a system class.");
    		}
     
    		//----- Try to load it from preferred source
    		// Note loadClassBytes() is an abstract method
    		classBytes = loadClassBytes(className);
    		if (classBytes == null) {
    			throw new ClassNotFoundException();
    		}
     
    		//----- Define it (parse the class file)
    		result = defineClass(className, classBytes, 0, classBytes.length);
    		if (result == null) {
    			throw new ClassFormatError();
    		}
     
    		//----- Resolve if necessary
    		if (resolveIt) resolveClass(result);
     
    		// Done
    		classes.put(className, result);
    		monitor(">> Returning newly loaded class.");
    		return result;
    	}
    //	---------- Public Methods ------------------------------
    	/**
             * This optional call allows a class name such as
             * "COM.test.Hello" to be changed to "COM_test_Hello",
             * which is useful for storing classes from different
             * packages in the same retrival directory.
             * In the above example the char would be '_'.
             */
    	public void setClassNameReplacementChar(char replacement) {
    		classNameReplacementChar = replacement;
    	}
    //	---------- Protected Methods ---------------------------
    	protected abstract byte[] loadClassBytes(String className);
     
    	protected String formatClassName(String className) {
    		if (classNameReplacementChar == '\u0000') {
    			// '/' is used to map the package to the path
    			return className.replace('.', '/') + ".class";
    		} else {
    			// Replace '.' with custom char, such as '_'
    			return className.replace('.',
    					classNameReplacementChar) + ".class";
    		}
    	}
    	protected void monitor(String text) {
    		if (monitorOn) print(text);
    	}
    //	--- Std
    	protected static void print(String text) {
    		System.out.println(text);
    	}
     
    } // End class
    Bien que tout semble tourner, apparemment, il ne retourne aucun objet.
    y a t'il encore quelque chose à régler ?

    @++ et merci encore de ton aide.
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GLDavid
    Bien que tout semble tourner, apparemment, il ne retourne aucun objet.
    y a t'il encore quelque chose à régler ?
    Ton ClassLoader peut poser problème : tu ne devrait pas redéfinir la méthode loadClass() mais plutôt findClass() comme c'est indiqué dans la doc de loadClass() :
    Subclasses of ClassLoader are encouraged to override findClass(String), rather than this method.
    Explications : findClass() se contente de rechercher la classe dans le ClassLoader courant, tandis que loadClass() propose un mécanisme plus complet (avec recherche dans le CL parent).


    De plus, je pense qu'il serait bien plus simple d'utiliser URLClassLoader qui semble bien correspondre à tes besoins (URLClassLoader gère entre autres les protocols file: et http: ) :

    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
    	public static Object loadClass(File jarFile, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException, MalformedURLException{
    		/*
    		 * Create the jar class loader and use the first argument
    		 * passed in from the command line as the jar file to use.
    		 */
    		URLClassLoader jarLoader = new URLClassLoader(
    				new URL[] { jarFile.toURI().toURL() },
    				Test.class.getClassLoader()
    				);
    		/* Load the class from the jar file and resolve it. */
    		Class c = jarLoader.loadClass(className);
     
    		/*
    		 * Create an instance of the class.
    		 *
    		 * Note that created object's constructor-taking-no-arguments
    		 * will be called as part of the object's creation.
    		 */
    		Object o = c.newInstance();
    		return o;
    	}
    Et à la rigueur tu pourrais te faire un URLClassLoader qui contiendrait tout tes jars...


    a++

  10. #10
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Je n'ai qu'un mot à dire, merci MONSIEUR Adi

    L'URLClassLoader m'aide franchement !!!
    Donc, un big à toi !!!

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    De rien

    J'ai déjà galérer avec les ClassLoader donc je sais ce que c'est

    a++

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

Discussions similaires

  1. Problème avec mon fichier jnlp
    Par aljessy dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 13/10/2011, 16h11
  2. [Jnlp] Problème avec FileSaveService et une BufferedImage
    Par Frac10 dans le forum Général Java
    Réponses: 4
    Dernier message: 22/06/2006, 12h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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