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

  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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    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

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    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.

  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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    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 ?

  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 : 38
    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
    Points : 2 560
    Points
    2 560
    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,

  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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    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.

  7. #7
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    C'est assez complexe à réaliser. Complexe car il n'y a pas que les appels directs à prendre en compte. Il y a toutes les librairies qui font de l'instanciation par java.lang.reflect, il y a toutes les factory qui prennent des paramètre ou qui sont fonctions de l'environnement, il y a toutes les librairies externes qui sont instanciée par des classes de de la jvm (typiquement les Drivers JDBC mais pas seulement), etc. Tout ça rend la création d'outil automatiques complexe et hasardeuse selon moi.


    De toutes façons, tu trouvera ces outils sous l'appellation "jar optimizer" en général

  8. #8
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Ok merci.

    Je suis en train de voir si j'arrive à le faire moi même avant compilation.

  9. #9
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    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.
    Je n'ai jamais essayé mais dans l'onglet "Shrinking", on peut lui dire le type d'application a garder (applet, servlet, application,...) et en face de chacun, mettre les classes a garder. D'apres ce que j'ai compris, c'est ce que tu veux faire.

    Citation Envoyé par tchize_ Voir le message
    C'est assez complexe à réaliser. Complexe car il n'y a pas que les appels directs à prendre en compte. Il y a toutes les librairies qui font de l'instanciation par java.lang.reflect, il y a toutes les factory qui prennent des paramètre ou qui sont fonctions de l'environnement, il y a toutes les librairies externes qui sont instanciée par des classes de de la jvm (typiquement les Drivers JDBC mais pas seulement), etc. Tout ça rend la création d'outil automatiques complexe et hasardeuse selon moi.
    En ce qui concerne la reflexion, je ne sais pas si proguard le gere (jamais essayé). Par contre, il gere les Class.forName (avec une string constante, je l'ai testé ). Sinon, il est possible de lui dire de garder certaines classes et de ne pas changer leur nom. Mais c'est sur que c'est galere de faire ca pour chaque classe potentiellement invoquée. Ceci dit, il n'y a pas vraiment de solution vu que la classe a importer peut etre lue dans un fichier de config. Donc un outil peut pas deviner...

  10. #10
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Je n'ai jamais essayé mais dans l'onglet "Shrinking", on peut lui dire le type d'application a garder (applet, servlet, application,...) et en face de chacun, mettre les classes a garder. D'apres ce que j'ai compris, c'est ce que tu veux faire.
    On peut lui dire de garder certaines classes, mais pas de garder les classes qu'utilise une classe donnée. Et c'est ça que je veux faire :s

    Mon autre souci avec ProGuard c'est que je n'arrive pas à lui donner le lien vers ma JVM. Du coup, soit il ne reconnaît rien (aucune classe Java), soit il dit que tout est en double :-(

  11. #11
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    On peut lui dire de garder certaines classes, mais pas de garder les classes qu'utilise une classe donnée. Et c'est ça que je veux faire :s
    Bah à partir du moment ou tu lui dit de garder une classe, il est sensé garder toutes les classes qu'elle utilise. Et de ce que j'ai pu tester, ca marche plutot bien puisque je me retrouvais avec un jar beaucoup plus petit mais qui fonctionnait bien. Ca ne marche pas chez toi?

    Citation Envoyé par ToTo13 Voir le message
    Mon autre souci avec ProGuard c'est que je n'arrive pas à lui donner le lien vers ma JVM. Du coup, soit il ne reconnaît rien (aucune classe Java), soit il dit que tout est en double :-(
    Dans l'onglet input/output, il faut mettre dans la fenetre du haut le jar de ton programme (c'est lui qui sera modifié) et dans la fenetre du bas les jars librairie (pour que l'outil sache qu'il ne faut pas toucher aux appels vers ces librairies). C'est dans cette fenetre qu'il faut mettre les librairies de la jvm (rt.jar et compagnie).

    Je n'ai jamais fait de truc tres avancé avec proguard mais d'apres ce que j'ai pu voir dans les menus, et que j'ai compris de ton probleme, ca a l'air de faire exactement ce que tu veux...

  12. #12
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Mmm... je lui ai donné mon jar et il le lit sans problème.
    Par contre, je n'arrive pas à lui donner ma JVM et quoi que je fasse il me trouve aucune classe ou toutes les classes en double :-(

  13. #13
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Souci avec ProGuard
    J'ai continué à regardé ce problème avec ProGuard puisque ça a l'air d'être la solution de mes soucis.

    En fait dans la partie Input/Output où l'on doit donner la JVM, il y a le lien que l'on retrouve par défaut /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/rt.jar
    Après une recherche, je ne trouve nulle part ce paquet :-(

    Quelqu'un aurait il une idée ?

  14. #14
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Il y a très très longtemps (dans une autre galaxie ) j'ai fait ça avec un script shell:
    le code ne contenant aucun appel dynamique tout recompiler à la main avec une option verbose, passer un coup de "awk" sur la trace et hop voilà la liste des classes utilisées par le programme en éliminant toutes les "librairies".
    Comme le fait remarquer _tchize ce truc ne marche plus dès qu'il y a du dynamique.

  15. #15
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    En fait dans la partie Input/Output où l'on doit donner la JVM, il y a le lien que l'on retrouve par défaut /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/rt.jar
    Après une recherche, je ne trouve nulle part ce paquet :-(
    Dans la partie du bas, il faut mettre l'ensemble des librairies utilisées (celles qui ne seront pas modifiées). Quand tu dis que tu ne le trouve pas, tu parles sur ton disque, dans le repertoire que tu donnes ? Si oui, ca explique qu'il y ait un probleme...

    Citation Envoyé par professeur shadoko Voir le message
    Il y a très très longtemps (dans une autre galaxie ) j'ai fait ça avec un script shell:
    le code ne contenant aucun appel dynamique tout recompiler à la main avec une option verbose, passer un coup de "awk" sur la trace et hop voilà la liste des classes utilisées par le programme en éliminant toutes les "librairies".
    Ca marche aussi. Mais pour les plus feignants, il y a des outils qui le font aussi

    Citation Envoyé par professeur shadoko Voir le message
    Comme le fait remarquer _tchize ce truc ne marche plus dès qu'il y a du dynamique.
    C'est vrai mais quand il n'y en a pas, ca marche tres bien D'ailleurs, en ce qui concerne proguard (le seul que je connais), il met un warning quand il y a du code dynamique. Comme toujours avec un outil de ce type, c'est au développer de savoir ce qu'il fait. Meme avec le meilleur tourne vis du monde entre les mains, une bille en mecanique reste une bille en mecanique

  16. #16
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Dans la partie du bas, il faut mettre l'ensemble des librairies utilisées (celles qui ne seront pas modifiées). Quand tu dis que tu ne le trouve pas, tu parles sur ton disque, dans le repertoire que tu donnes ? Si oui, ca explique qu'il y ait un probleme...
    C'est ça.
    Du coup il ne trouve aucune des classes utilisées dans mon code, même pas celles qui sont de base dans Java.
    Le souci c'est que je ne sais pas quoi mettre comme lien :-(

  17. #17
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Pour ma part, étant un grand utilisateur du logiciel Yed, j'utilise l'outil de la même société qui s'appelle yGuard. Comme son nom l'indique, c'est un équivalent de ProGuard, livré sous forme de tâche ANT.

    Il y a des exemples de scripts ANT suivant ce qu'on désire faire (publication d'API, compactage a partir d'une Main-Class, ...)

    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
    <project name="project" default="yguard" basedir=".">
      <target name="yguard">
        <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="yguard.jar"/>
        <yguard>
     
          <inoutpair in="original.jar" out="shrinked.jar"/>
          <shrink logfile="shrinklog.xml">
            <keep>
              <method name="void main(java.lang.String[])" class="com.mycompany.MyMainClass" />
            </keep>
          </shrink>
     
        </yguard>
      </target>
    </project>

  18. #18
    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Merci, mais j'avoue que je ne sais absolument pas utiliser ANT :-(
    C'était pour ça que je me tournais vers ProGuard.

  19. #19
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Merci, mais j'avoue que je ne sais absolument pas utiliser ANT :-(
    C'était pour ça que je me tournais vers ProGuard.


    Bah, c'est pas le plus dur. C'est du makefile en XML

    En plus, c'est intégré dans Eclipse: Tu colles le contenu dans un fichier "build.xml" à la racine du projet, et depuis Eclipse : clic droit sur "build.xml" -> Run As -> Ant Build.

  20. #20
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Le souci c'est que je ne sais pas quoi mettre comme lien :-(
    Tu as essayé de virer cette lib qui n'existe pas et d'ajouter la bonne ? rt.jar du jdk/jre? Ca fait la meme erreur?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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