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

NetBeans Java Discussion :

Problème de création de .jar exécutable


Sujet :

NetBeans Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Problème de création de .jar exécutable
    Bonjour à tous,

    Je suis en train de développer une appli Java sous Netbeans (je débute), que j'aimerais livrer sous forme d'un .jar exécutable.
    Après quelques recherches sur le net, je constate qu'il est très aisé de créer/récupérer le .jar dans le dossier 'dist' du projet (après avoir build ce dernier), le problème est que lorsque je lance le .jar depuis son emplacement de création (dist) ou même d'un autre, il n'a pas du tout le comportement attendu !... et même un comportement différent suivant les 2 cas.

    Voici les différents comportements :

    1. application lancée via Netbeans
      a. connexion OK
      Nom : OK - Login.jpg
Affichages : 398
Taille : 28,5 Ko

      b. accueil OK
      Nom : OK - appli.jpg
Affichages : 273
Taille : 56,9 Ko

    2. .jar exécuté depuis son emplacement de création (répertoire 'dist' du projet)
      a. connexion OK
      Nom : OK - Login.jpg
Affichages : 398
Taille : 28,5 Ko

      b. accueil buggé (que le menu d'affiché)
      Nom : KO - appli.jpg
Affichages : 269
Taille : 27,9 Ko

    3. .jar exécuté depuis le bureau
      a. connexion impossible
      Nom : KO - Login.jpg
Affichages : 267
Taille : 29,8 Ko


    Auriez-vous une idée de ce qu'il se passe ?

    A noter que :
    - j'utilise une BDD SQLServer, avec le pilote qui va bien.
    - j'ai également fait un test en générant le .jar depuis Eclipse, je retombe sur le scénario 3

    A vot' bon coeur !
    Merci merci !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je dirais que ça vient des ressources : l'image déjà, là, qu'on distingue dans ton image floutée (peut-être combiné avec un problème de layout particulier). Comment est configuré l'accès à la base (l'url particulièrement) : directement dans le code, ou dans un fichier properties, ou autre fichier de configuration, qui pourrait être également une ressource ? Dans ce cas, combinée à une gestion trop simpliste des SQLException, ceci pourrait expliquer ton problème de connexion.

    Si tu accèdes a tes ressources par un chemin relatif, par la classe File ou la classe Path, l'exécution de ton jar dans le dossier dist fera qu'elles ne pourront être trouvées (il faut utiliser plutôt la méthode getRessource() (ou éventuellement getResourceAsStream() selon) de la classe Class, ou ClassLoader), ce qui te permettra d'accèder aux ressources par URL, et donc également à celle qui se trouvent dans le jar (et qui ne sont donc pas des fichiers).

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Déjà, merci pour ta réponse rapide !

    Citation Envoyé par joel.drigo Voir le message
    l'image déjà, là, qu'on distingue dans ton image floutée (peut-être combiné avec un problème de layout particulier).
    J'ai ajouté l'image en fond du ContentPane de la Frame avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.setContentPane(new PanelImage());
    Sachant que PanelImage contient ceci (- les imports) :
    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
    public class PanelImage extends JPanel {
     
        public Image image;
     
        public PanelImage()
        {
            image = Toolkit.getDefaultToolkit().getImage("src\\interfaces_graphiques\\fond.jpg");
            try
            {
                MediaTracker mt = new MediaTracker(this);
                mt.addImage(image, 0);
                mt.waitForAll();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            this.setPreferredSize(new Dimension(image.getWidth(this), image.getHeight(this)));
        }
     
        @Override
        public void paintComponent(Graphics g)    
        {
            g.drawImage(image ,0, 0, this.getWidth(), this.getHeight(), this);
        }                                    
    }
    Citation Envoyé par joel.drigo Voir le message
    Comment est configuré l'accès à la base (l'url particulièrement) : directement dans le code, ou dans un fichier properties, ou autre fichier de configuration, qui pourrait être également une ressource ? Dans ce cas, combinée à une gestion trop simpliste des SQLException, ceci pourrait expliquer ton problème de connexion.
    Je me connecte très simplement via une classe de connexion via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
          String url = "jdbc:sqlserver://serveur-sql2008:1433; databaseName = 01_ProjetQNS;";
          conn = java.sql.DriverManager.getConnection(url, login, pswd);
          OK = true;
    }
    catch (Exception e) 
    {
          OK = false;
    }
    Citation Envoyé par joel.drigo Voir le message
    Si tu accèdes a tes ressources par un chemin relatif, par la classe File ou la classe Path, l'exécution de ton jar dans le dossier dist fera qu'elles ne pourront être trouvées (il faut utiliser plutôt la méthode getRessource() (ou éventuellement getResourceAsStream() selon) de la classe Class, ou ClassLoader), ce qui te permettra d'accèder aux ressources par URL, et donc également à celle qui se trouvent dans le jar (et qui ne sont donc pas des fichiers).
    En effet, j'utilise un chemin relatif, mais je n'utilise ni File ni Path. Je n'ai pas procédé correctement ?

  4. #4
    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
    Citation Envoyé par Altitude_K Voir le message
    En effet, j'utilise un chemin relatif, mais je n'utilise ni File ni Path. Je n'ai pas procédé correctement ?
    Tu utilises createImage(String filename), ce qui reviens au même Utiilise la version qui prends un URL plutôt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/interfaces_graphiques/fond.jpg"));
    Ensuite, il suffit de lancer ton jar depuis une console avec java -jar nomdujar.jar et tu aurais vu tout de suite l'erreur affichée.

    Par rapport à ton code, qu'apporte ton PanelImage par rapport à un simple ImageIcon + JLabel? Le wait dans le constructeur, c'est bof bof. Si le constructeur est appelé comme il se doit dans l'EDT, ça veux dire que tu bloques l'affichage pendant un moment.

    Pour ta connexion, je suppose que tu as oublié d'inclure les librairies dont dépendend ton jar quand tu l'as déplacé

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    catch (Exception e) 
    {
          OK = false;
    }
    Tu ne risques pas d'avoir le message d'erreur exact (mais l'absence de bibliothèque jdbc est en effet l'hypothèse la plus vraissemblable). Pour afficher l'erreur SQL, voir comment c'est fait ici (ou afficher e.getMessage() au minimum).

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu utilises createImage(String filename), ce qui reviens au même Utiilise la version qui prends un URL plutôt.
    Nice, ça roule.
    Citation Envoyé par tchize_ Voir le message
    Ensuite, il suffit de lancer ton jar depuis une console avec java -jar nomdujar.jar et tu aurais vu tout de suite l'erreur affichée.
    En effet, je prends cette habitude dès maintenant !
    Citation Envoyé par tchize_ Voir le message
    Par rapport à ton code, qu'apporte ton PanelImage par rapport à un simple ImageIcon + JLabel?
    Dans pas mal de posts j'ai vu que c'était plus propre qu'utiliser un JLabel.
    Citation Envoyé par tchize_ Voir le message
    Le wait dans le constructeur, c'est bof bof. Si le constructeur est appelé comme il se doit dans l'EDT, ça veux dire que tu bloques l'affichage pendant un moment.
    J'ai vu ça chez Doudoux (commentaire après le 2ème exemple).

    Citation Envoyé par tchize_ Voir le message
    Pour ta connexion, je suppose que tu as oublié d'inclure les librairies dont dépendend ton jar quand tu l'as déplacé
    Citation Envoyé par joel.drigo Voir le message
    l'absence de bibliothèque jdbc est en effet l'hypothèse la plus vraissemblable
    Le problème vient bien de ma librairie JDBC, mais je ne comprends pas pourquoi : sous Netbeans j'ai bien ma librairie, et elle est bien dans le .jar si je le décompresse. Par contre j'ai toujours le message d'erreur suivant : No suitable driver found for jdbc://XXXXXX.
    Je n'ai pour pas encore trouvé de solution sur le net, des idées ?

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Altitude_K Voir le message
    Dans pas mal de posts j'ai vu que c'était plus propre qu'utiliser un JLabel.
    Ça dépend : si l'image peut être affichée dans sa taille d'origine, ou une taille fixe, c'est plus simple d'utiliser un JLabel. Si la taille de l'image doit pouvoir être adaptée dynamiquement, il faut effectivement l'afficher dans le fond d'un JPanel (ou Canvas).

    Citation Envoyé par Altitude_K Voir le message
    J'ai vu ça chez Doudoux (commentaire après le 2ème exemple).
    Ce n'est utile que pour lorsqu'on charge les images en asynchrone (ce qui est le cas avec une ImageIcon). On peut utiliser ImageIO à la place.

    Citation Envoyé par Altitude_K Voir le message
    Le problème vient bien de ma librairie JDBC, mais je ne comprends pas pourquoi : sous Netbeans j'ai bien ma librairie, et elle est bien dans le .jar si je le décompresse. Par contre j'ai toujours le message d'erreur suivant : No suitable driver found for jdbc://XXXXXX.
    Je n'ai pour pas encore trouvé de solution sur le net, des idées ?
    Comment as-tu intégré le jar ? Le classpath dans le manifest le référence-t-il bien ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Comment as-tu intégré le jar ?
    Via Netbeans, Propriétés du projet > Librairies > Add JAR/Folder
    Nom : Libs.jpg
Affichages : 250
Taille : 6,3 Ko
    Citation Envoyé par joel.drigo Voir le message
    Le classpath dans le manifest le référence-t-il bien ?
    Voilà mon manifest (mon .jar est à la racine du projet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Manifest-Version: 1.0 
    Main-Class: main.main
    Class-Path: sqljdbc4.jar

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Oh put***, en écrivant ça je viens de comprendre...
    Je change mon manifest en ajoutant /lib/

    Par contre, y'a moy de l'intégrer au jar en lui même, pour n'avoir qu'un fichier à distribuer ?

  10. #10
    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
    Citation Envoyé par Altitude_K Voir le message
    J'ai vu ça chez Doudoux (commentaire après le 2ème exemple).
    Arf, ben pour une fois il a tort tiens Le chargement est asynchrone, il suffit de définir la taille de ton composant après le chargement, plutôt que dans le constructeur Pour ça faut un Thread à part. D'où l'intérêt de JLabel ou ImageIO. Ton code est loin d'être plus propre qu'un JLabel: il nécessite de la maintenance, il cause des erreurs. Autant se reposer sur les briques existantes.


    Citation Envoyé par Altitude_K Voir le message
    Par contre, y'a moy de l'intégrer au jar en lui même, pour n'avoir qu'un fichier à distribuer ?
    Surement puisque eclipse en est capable. Mais j'ignore comment le faire avec netbeans.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Arf, ben pour une fois il a tort tiens
    Je m'éloigne un peu du sujet (mis en résolu d'ailleurs), mais tu sous-entends qu'il a souvent tort ?
    On m'avait dit à plusieurs reprises que c'était une source fiable...

    En tout cas, merci beaucoup pour vos réponses !

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Septembre 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Surement puisque eclipse en est capable. Mais j'ignore comment le faire avec netbeans.
    Pour ceux que ça intéresse, voir ici.

  13. #13
    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
    Citation Envoyé par Altitude_K Voir le message
    mais tu sous-entends qu'il a souvent tort ?
    Au contraire, aucune ironie dans mon message, première fois que je vois ce que je considère comme une bourde dans son tuto

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

Discussions similaires

  1. Problème de création ficher .jar
    Par redenil dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/06/2009, 08h17
  2. [Compiler] Problème de création d'un exécutable
    Par balat_b dans le forum MATLAB
    Réponses: 2
    Dernier message: 13/05/2008, 23h36
  3. Précision pour une création de .jar exécutable
    Par cysboy dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2006, 11h03
  4. problème de création de .jar (encore)
    Par Nicool dans le forum Langage
    Réponses: 5
    Dernier message: 20/06/2006, 12h56
  5. création javadoc + jar exécutable
    Par scoder dans le forum Langage
    Réponses: 7
    Dernier message: 04/11/2005, 17h06

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