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

Java Discussion :

Jar ne contenant que les classes nécessaires


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut Jar ne contenant que les classes nécessaires
    Bonjour,

    ben tout est dans le titre :-)
    J'ai créé une bibliothèque super complète de mon travail et je dois en donné juste une partie à un partenaire. Je n'ai vraiment pas envie de fournir toute ma lib.
    Je souhaiterai donc savoir s'il y a une solution pour générer automatiquement un jar ne contenant que les classes nécessaires en fonction de ce qui est appelé dans mon main.
    J'ai lu des ébauches incomplètes de solutions qui disaient que l'on pouvait peut être faire cela avec Ant ou jBuilder.

    PS : si je peux aussi directement inclure dans ce jar les autres jar externes dont j'ai besoin, ce serait vraiment parfait !

    Est ce que quelqu'un aurait une idée pour ceci ?
    Merci par avance
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Tu peux créer un jar normal puis utiliser un outil : ProGuard.
    Il permet d'obfusquer le code (si necessaire) et de virer toutes les classes/fonctions non utilisées. A voir si ca convient.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Merci, cela semblerait faire l'affaire.
    Je pensais plutôt ne pas mettre dans le jar ce qui est inutile, mais supprimer ce qu'il se doit après création du jar convient également.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Il semblerait que je ne puisse pas donner à ProGuard la classe qui m'intéresse comme point de départ afin qu'il supprime tout ce dont elle n'a pas besoin :-(
    A moins que j'ai mal compris les options.


    Est ce que quelqu'un aurait une autre idée ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,
    si tu utilises maven dans ton projet, je te conseille le plugin maven shade plugin qui te permet d'exclure tout ce que tu veux, mêmes des packages, d'inclure et/ou d'exclure des .jars, d'inclure et/ou d'exclure des classes etc etc ..
    Si tu utilises Ant pour ton projet, pourquoi n'utiliserais tu pas les balises <exclude> lors de la compilation ? Exemple:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <target name="compile" depends="clean">
      <javac destdir="classes" source="1.5" >
        <src path="src"/>
        <exclude name="**/_*.java"/>
        <exclude name="**/Test*.java"/>
        <classpath refid="class.path"/>
      </javac>
    </target>
    Parce qu'il faut savoir que si tu veux uniquement supprimer certaines classes après la compilation, bah, ce sera possible, mais dans ce cas, comme tu t'en doutes bien, si jamais tu exécutes une méthode qui fait appel à cette classe (.class) alors qu'elle n'est pas dans le .jar, tu auras un CNFE (ClassNotFoundException)
    Donc, si tu veux réellement supprimer des .class après compilation, si tu utilises Ant ou même Maven, .. tu peux toujours utiliser la tâche <delete> après avoir compilé via la tâche <javac>
    Exemple:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <target name="compile" depends="clean">
    <target name="compile">
      <javac destdir="classes" source="1.5" >
        <src path="src"/>
        <classpath refid="class.path"/>
        <!-- blablah ... -->
      </javac>
      <!-- Là, on supprime les .class que je ne veux pas inclure dans le .jar -->
      <delete file="bin/net/dvp/projet/Foo.class />
      <delete file="bin/net/dvp/projet/Bar.class />
      <delete>
        <fileset dir="bin/" includes="net/dvp/projet/secret/*.class" />
      </delete>
    </target>
    Et ensuite, tu crées ton .jar final ...
    Cordialement,
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Mmm... il me semble que ce n'est pas exactement ce que je voudrai faire, sans doute me suis je mal exprimé ou sinon c'est moi qui ne comprends pas quelque chose.

    En fait je voudrai pouvoir donner une ou plusieurs classes de références et supprimer toutes les classes qui ne seront pas utilisées (directement ou indirectement) par mes classes de références.
    Donc supprimer toutes les classes qui ne seraient pas appelées pendant l'exécution des classes de références.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    J'ai réussi à faire à peu près ce que je voulais en utilisant ce code :
    Code xml : 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
     
    <project name="project" default="yguard" basedir=".">
    	<target name="yguard">
    		<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="../lib/yguard.jar"/>
     
    		<yguard>
    			<inoutpair in="../../../firetiti.jar" out="tmp.jar"/>
    			<shrink>
    				<keep>
    					<class classes="public" methods="public" fields="public">
    						<patternset>
    							<!-- liste des classes à préserver/-->
    						</patternset>
    					</class>
    				</keep>
    			</shrink>
    		</yguard>
     
     
    		<yguard>
    			<inoutpair in="tmp.jar" out="../../../firetiti_lite.jar"/>
    			<rename>
    				<keep>
    					<class classes="public" methods="public" fields="public">
    						<patternset>
    							<!-- liste des classes à préserver/-->
    						</patternset>
    					</class>
    				</keep>
    			</rename>
    		</yguard>
     
    	</target>
    </project>

    Seulement, je dois mettre deux fois exactement la même liste de classes dans les <includes>.
    Y aurait il un moyen de mettre tout cela dans une variable que l'on appellerait où il faudrait ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Seulement, je dois mettre deux fois exactement la même liste de classes dans les <includes>.
    Y aurait il un moyen de mettre tout cela dans une variable que l'on appellerait où il faudrait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <shrink>
      <keep>
        <class classes="public" methods="public" fields="public">
          <patternset id="myfiles">
            <!-- liste des classes à préserver/-->
          </patternset>
        </class>
    ...
    <rename>
      <keep>
        <class classes="public" methods="public" fields="public">
          <patternset refid="myfiles"/>
        </class>
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Ca marche super bien !
    Une fois de plus... MERCI
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2012, 15h40
  2. Enum contenant que les lettre alphabetiques
    Par freestyler1982 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/08/2010, 21h35
  3. Réponses: 18
    Dernier message: 31/07/2008, 13h51
  4. Réponses: 4
    Dernier message: 07/07/2006, 15h44
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

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