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

avec Java Discussion :

De l'export en .jar


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut De l'export en .jar (système de plugin)
    Bonjour,

    J'arrive à créer mes .jar exécutables. J'arrive même (ô miracle) à utiliser des .jar externes comme JDom.

    Pour info, j'ai suivi (et tenté d'affiner) le tutoriel de maitre Wicht sur le système de mise à jour maison.

    Seulement voilà, je me retrouve avec toute une série de .jar (trois perso et un jdom et un dbw) que je fais télécharger par mon application.

    J'ai deux questions :
    -Je vois pas l'intérêt de distribuer à mes "clients", un jdom.jar séparé de mon .jar exécutable, vu que son absence bloque le programme. ça me semble plus source de problème qu'autre chose : donc est-il possible d'inclure jdom.jar dans mon jar exécutable afin qu'il soit indissociable et invisible pour l'utilisateur ?

    - A l'inverse, le .jar central de mon application fait 3Mo et quand il y a une mise à jour à faire, le temps de téléchargement complet est sensible, pour des mises à jours parfois mineures. Est-il possible de "découper" mon .jar (un .jar exécutable pour lancer l'appli et des .jar dissociés pour les différentes fonctionnalités) ? Ceci afin de pouvoir ne mettre à jour que les parties concernées

    J'espère avoir été assez clair. Merci de votre attention (et de votre aide, peut-être)

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    juste une idée, plusieurs jar, distribution, téléchargement automatique de mises à jour .... Ce serait pas un boulot pour java webstart tout ça?

    Pour ce qui est d'exploser jdom et le l'inclure dans ton jar, ce ne devrais poser aucun soucis. En pratique, la méthode dépend de ce que tu fait pour créer ton jar.

    Pour ce qui est de télécharger des jars à la demande, tout le soucis est de déterminer correctement quand tu aura besoin du jar. Mis a part ça, il faut séparer ton projet en plusieurs modules, et charger chaque module optionnel dans un jarclassloader. Il faudra que les modules implémentent des interfaces présentent dans le noyau de ton application et c'est ces interface que ton noyau utilisera pour communiquer avec les modules (par ce que passer par de la réflection à chaque fois que t'aura besoin d'une classe ca pourrait etre lourd)

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Ok, ok, je crois que dans l'absolu je comprend tout. Faut que je mette en pratique.

    Je cours potasser jarclassloader, java web start et de la bonne utilisation des interfaces. Pour ce qui est de la reflexion, je passe déjà par la reflexion pour lancer une bonne partie de mon appli (choix entre différentes fonctions) alors ce sera pas forcement plus lourd qu'à présent.

    Merci de ton aide.

    Quand à comment je fais mais jar, ben, heu... exporter->archive jar dans eclipse... c'est peut-être pas top top raffiné, mais je sais pas faire autrement.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Bon pour le java web start, je crois que je peux refermer cette piste. Je suis dans l'amateurisme complet, je n'ai accès qu'à des serveur type free donc je suppose que c'est mort d'utiliser jws sur ce type de machines ?

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    y a pas de raison que ce soit mort, javawebstart utilise uniquement des serveur web. Sur des serveurs "de base" t'aura peut etre un peu de difficulté à faire ouvrir le .jnlp par javawebstart, c'est pas impossible non plus. Y a normalement meme pas besoin de serveur dynamique.

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Pour ce qui est d'exploser jdom et le l'inclure dans ton jar, ce ne devrais poser aucun soucis.
    heu... aucun soucis pour toi sans doute, perso je n'y arrive pas

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu ouvre le jar avec un gestionnaire d'archive quelconque, tu extrait tout dans un répertoire "ressources" de ton project et tu configure ton projet pour inclure ce répertoire à la racine du classloader.

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Mouaip, enfin bon c'est un poil crade comme façon de procéder, puis niveau respect des licenses faut voir si ça colle ce qui n'est pas forcément sûr.

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu pourrais développer un peu? Je suis curieux de savoir ce qui te fait dire ça.

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Il faudra que les modules implémentent des interfaces présentent dans le noyau de ton application et c'est ces interface que ton noyau utilisera pour communiquer avec les modules (par ce que passer par de la réflection à chaque fois que t'aura besoin d'une classe ca pourrait etre lourd)
    Je te remercie de ton aide, "MaClassLoader" marche bien. Mon système de plugin fonctionne à merveille.
    J'utilise un .xml, pour récupérer toutes les propriétés du plugin, puis j'appelle la class principale (qui porte le même nom que le jar) qui fait ensuite sa vie.

    [Je posterai un bout de code dès mon retour à la maison]

    J'aimerai pouvoir également récupérer des sons présents sur les jars, mais je ne sais pas comment passer d'un JarEntry à un AudioClip.

    Comme je crée mes AudioClip par JApplet.newAudioClip(URL)

    Je suppose qu'il faudrait que je sache créer une URL qui pointe vers l'intérieur de mon Jar externe, mais là encore je ne sais pas faire, et je ne trouve rien sur internet de ce genre.

    Quelqu'un sait-il ?

    D'avance merci.

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par firgon Voir le message
    Comme je crée mes AudioClip par JApplet.newAudioClip(URL)

    Je suppose qu'il faudrait que je sache créer une URL qui pointe vers l'intérieur de mon Jar externe, mais là encore je ne sais pas faire, et je ne trouve rien sur internet de ce genre.
    Tu utilise ton classloader correspondant au jar, sur le classloader t'as une méthode getResource() qui te retourn une URL. Par contre, je suis pas sur que audioclip sache travailler avec des urls autres que file:/// et http:///.
    A tester

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Merci à toi Tchize pour ton aide.

    j'ai réalisé ce que je voulais. Un système de plugin qui me permet d'ajouter à l'envi autant de jeux que je veux à mon interface, pour peut que je place dans le fichier /jeux/ des jars avec une classe principale du même nom que le .jar et un fichier .xml fournissant les informations sur le jeux (nb joueurs, type, etc...)

    voici le code, s'il y ' en a que ça intéresse.

    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    package general;
     
    import java.io.File;
    import java.io.InputStream;
    import java.net.*;
    import java.util.Enumeration;
    import java.util.Iterator;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
     
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
     
    import lancement.Data;
     
    public class MaClassLoader {
     
    	//les tableaux des différentes informations qui décrivent chaque plugin/jeu
    	private Class [] lesClasses;
    	private String [] lesNoms, lesRegles, lesAuteurs;
    	private int [] lesJoueursMin, lesJoueursMax;
    	private String [][] lesFichiersSons;
    	private Boolean [] lesTypesDeJeux;
    	private JarFile [] lesJars;
     
    	public MaClassLoader() {
     
    		//on récupère sous forme de tableau la liste des différents jeux/plugins disponibles
    		//dans le répertoires adéquats
    		File[] jarsDispos = new File(System.getProperty("user.dir")
    				+ File.separator + Data.dossierJeux).listFiles();
     
    		//on initialise l'ensemble des tableaux à la longueur du nombre de plugins/jeux installés
    		int nbJars = jarsDispos.length;
     
    		lesClasses = new Class[nbJars];
    		lesNoms = new String[nbJars];
    		lesRegles = new String[nbJars];
    		lesAuteurs = new String[nbJars];
    		lesTypesDeJeux = new Boolean[nbJars];
    		lesJoueursMax = new int[nbJars];
    		lesJoueursMin = new int[nbJars];
    		lesFichiersSons = new String[nbJars][];
    		lesJars = new JarFile[nbJars];
     
    		//pour chaque jar...
    		for (int index = 0; index < nbJars; index++) {
     
    			try {
    				String nomJar = jarsDispos[index].getName();
    				nomJar = nomJar.substring(0,nomJar.length() - 4);
    				nomJar = nomJar + ".class";
     
    				URL u = jarsDispos[index].toURI().toURL();
    				//On créer un nouveau URLClassLoader pour charger le jar qui se trouve ne dehors du CLASSPATH
    				URLClassLoader loader = new URLClassLoader(new URL[] { u });
     
    				//On charge le jar en mémoire
    				JarFile jar = new JarFile(jarsDispos[index].getAbsolutePath());
    				lesJars[index] = jar;
     
    				//On récupére le contenu du jar
    				Enumeration enumeration = jar.entries();
     
    				while (enumeration.hasMoreElements()) {
     
    					JarEntry fichiertemp = (JarEntry)enumeration.nextElement();
     
    					String tmp = fichiertemp.toString();
     
    					//Si le fichier courant est un .xml on l'analyse
    					if (tmp.length() > 4 && tmp.substring(tmp.length() - 4).compareTo(".xml") == 0) {
    //						on crée le document xml local
    					      SAXBuilder sxb = new SAXBuilder();
    					      Document XMLProprietes;
     
    					      try
    					      {
     
    					    	  InputStream flotOctet= jar.getInputStream(fichiertemp); 
     
    					         XMLProprietes = sxb.build(flotOctet);
    					      }
    					      catch(Exception e){
    					    	  e.printStackTrace();
    					    	  System.out.println("Archive introuvable!");
    					    	  XMLProprietes = null;
    					      }
    					      exploiteXML(XMLProprietes,index);
    					}
     
     
    					//On vérifie que le fichier courant est un .class
    					//et qu'il correspond au nom du .jar
    					if (tmp.length() > 6
    							&& tmp.substring(tmp.length() - nomJar.length()).compareTo(nomJar) == 0) {
     
    						// si tel est le cas, on enregistre ce .class comme une classe utilisable par le programme
     
    						tmp = tmp.substring(0, tmp.length() - 6);
    						tmp = tmp.replaceAll("/", ".");
     
    						Class tmpClass = Class.forName(tmp, true, loader);
    						lesClasses[index]=tmpClass;
     
     
    					}
    				}
    				} catch (Exception e) {
    				e.printStackTrace();
    			}
     
    		}
    	}
     
    	private void exploiteXML(Document proprietes, int index) {
    		if (proprietes != null)
    		{
     
    			//On récupère la racine
    			Element racine = proprietes.getRootElement();
     
    			//On récupère tous les Elements uniques
    			lesNoms[index] = racine.getChildText("Nom");
    			lesAuteurs[index] = racine.getChildText("Auteur");
     
    			//indique true si le type est égal à 1 (0 pour proto et donc false)
    			lesTypesDeJeux[index] = (Integer.parseInt(racine.getChildText("Type")) == 1);
     
    			lesJoueursMax[index] = Integer.parseInt(racine.getChildText("NbjMax"));
    			lesJoueursMin[index] = Integer.parseInt(racine.getChildText("NbjMin"));
     
    			lesRegles[index] = racine.getChildText("Regles");
     
    			//on liste tous les sons
    			List listSons = racine.getChildren("Sons");
    			Iterator iteratorSons = listSons.iterator();
     
    			lesFichiersSons[index] = new String [listSons.size()];
     
    			int i=0;
    			//On parcourt tous les sons
    			while(iteratorSons.hasNext()){
    				Element son = (Element)iteratorSons.next();
    				lesFichiersSons[index][i] = son.getChildText("Fichier");
    			}
     
    		}
     
    	}
     
    	public String getLesAuteurs(int intJeu) {
    		return lesAuteurs[intJeu];
    	}
     
    	public Class getLesClasses(int intJeu) {
    		return lesClasses[intJeu];
    	}
     
    	public String[] getLesFichiersSons(int intJeu) {
    		return lesFichiersSons[intJeu];
    	}
     
     
     
    	public int getLesJoueursMax(int intJeu) {
    		return lesJoueursMax[intJeu];
    	}
     
    	public int getLesJoueursMin(int intJeu) {
    		return lesJoueursMin[intJeu];
    	}
     
    	public String getLesNoms(int intJeu) {
    		return lesNoms[intJeu];
    	}
     
    	public String getLesRegles(int intJeu) {
    		return lesRegles[intJeu];
    	}
     
    	public Boolean getLesTypesDeJeux(int intJeu) {
    		return lesTypesDeJeux[intJeu];
    	}
     
    	public JarFile getLesJars (int intJeu){
    		return lesJars[intJeu];
    	}
     
    	public int getNbJeux () {
    		return lesClasses.length;
    	}
     
    }
    Je suppose qu'il y aurait sans doute des optimisations à apporter, mais je suis déjà content que ça marche

    Concernant mes premières interrogations : pour intégrer JDom dans mon .jar principal (celui qui utilise MaClassLoader), j'ai effectivement utilisé FatJar.

    Pour retouver mes fichiers sons j'ai effectivement utilisé getResources(chemin) mais pas sur le JarFile, sur les Class trouvées ; par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JApplet.newAudioClip(getLesClasses(0).getResource(chemin[i]));
    Merci aussi aux deux tutoriels qui m'ont aidé (celui-là et celui-ci)

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    un petit clic sur "résolu" ? c'est là en dessous
    ----------------------v

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    Bonjour,

    Pour ton problème technique de regrouper différent jar dans un seul jar, tu peux utiliser le plugin eclipse FatJar.

    Il permets de selectionner les jars que tu veux dans une petite interface graphique et de les inclures dans un gros jar, d'ou le fat jar

    A+

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    merci de ton aide, je viens de voir ça, je viens de télécharger fatjar, faut encore que je trouve un bon tutos, mais ça a l'air de correspondre à ce que je cherche effectivement.

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

Discussions similaires

  1. exportation en JAR sous eclipse
    Par popi182 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 23/08/2006, 14h32
  2. [.JAR] Exporter en .JAR
    Par netr dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 21/06/2006, 13h32
  3. Problème exportation fichier jar + mysql
    Par oliwan dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 07/05/2006, 20h58
  4. probleme d'exportation en JAR
    Par loic_86 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 27/04/2006, 21h53
  5. [POI]Exportation de Jar avec librairies
    Par leminipouce dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 26/10/2005, 18h20

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