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 :

Passer de Delphi à Java ?


Sujet :

avec Java

  1. #21
    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 : 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
    Par défaut
    pour information, le répertoire courant (puisque c'est ce que tu affiche apparement) est imprévisible pour l'application, il vaut donc mieux éviter de l'utiliser.

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    j'ai fait une tentative de copier mon appli sur une autre machine MAC.
    J'ai créé un dossier /brahma dans lequel j'ai copié tous les fichiers .class.
    Ensuite j'ouvre un terminal, et je fais les commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd /
    java -classpath /brahma brahma.brahma
    et j'obtiens cette fichue exception : NoClassDefFoundError

    JE comprends plus rien...

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pour information, le répertoire courant (puisque c'est ce que tu affiche apparement) est imprévisible pour l'application, il vaut donc mieux éviter de l'utiliser.
    OK. Du coup ce qui m'intéresse, c'est d'avoir le répertoire ou si situe l'exécutable (ou le .class) de l'application. En fait j 'ai toute une arborescence de fichiers à partir du répertoire dans lequel se trouve l'appli, et je voudrais que ca puisse être installé n'importe où. D'où la nécessité d'avoir quelque chose de stable (autre que forcer un répertoire d'installation). Ca règlerait je suppose cette bizarrerie des dossiers.

    Je bloque encore su rla diffusion de l'appli (voir autre post). D'ailleurs, existe-t-il un tuto TRES simple (j'ai visiblement toujours pas compris comment fonctionne Java) qui explique ce genre de choses ? En sachant prendre des cas simples...

  4. #24
    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 : 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
    Par défaut
    Alors, plusieurs chose, quand vous tappez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -classpath /brahma brahma.brahma
    Ca suppose qu'il existe un fichier /brahama/bramha/brahma.class

    Le premier étant le répertoire pointé par votre commande -classpath, le deuxième étant le nomb du package que vous avez mentionné, le troisième étant le nom de la classe.

    Trouver le répertoire où se trouve l'applicaiton est très difficile, car cette notion n'existe pas en java. Ainsi, si je tappe

    java -classpath main/:lib/librairie1.jar:lib/librairie2.jar:extensions/:datas/

    quelle valeur espérez vous en ressortir??

    En java, pour tout ce qui viens avec l'application, on utilise des resources, qui apparaissent sous forme d'url et non pas des File, qui nécessitent un emplacement précis sur le filesystem. A noter que ce n'est pas propre à java, le problème à résoudre est le même pour tous les language. Mais java, via les ressource, fournis une solution facile d'emploi.
    On les utilise comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL imageURL = getClass().getResource("/images/backgrond.png");
    Ensuite, ce que vous devez faire pour la distribution:

    empaqueter toutes vos classes et vos images & autres dans un .jar (voir les FAQ java pour savoir comment faire)
    mettre toutes les librairies éventuelles dont vous auriez besoin dans un sous dossier à coté du jar (exemple lib/)
    dans votre jar, vous aurez un fichier META-INF/MANIFEST.MF qui référencera votre main (à exécuter) et le Classpath (librairies dont l'emplacement est relatif à ce jar).
    Vous aurez donc ce genre de structure portable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    application.jar
    lib/
       librairie1.jar
       librairie2.jar
       librairie3.jar
    que vous pourrez, par exemple zipper.


    Bref, la bonne pratique c'est d'éviter d'utiliser File pour tout ce qui est supposé embarqué avec l'application. Par contre on utilise File pour tout ce qui est spécifique à l'utiliser (la config qu'on stocke dans user.home, les fichiers ouvert via une boite de dialogue, etc)

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Merci pour les infos.
    Du coup, entre temps, j'ai réfléchi et en fait j'ai contourné la difficulté en transmettant le répertoire où se situent mes données en paramètres et en récupérant args[0] et ca pour le coup ca marche aussi bien sous eclipse que sous terminal. C'est pas vraiment la solution, mais ca a le mérite de marcher.
    J'aurais quand même pu y penser plus tôt, ça aurait évité pas mal d'encre (ou plutôt de touches clavier... ).
    Pour constituer la "chose" packagée, je vais encore attendre un peu avant de m'y attaquer, j'ai tellement d'autres choses à voir (générer un PDF, faire des fenêtres ui ressemblent à quelque chose, sauver mes fichiers, manipuler les fichiers XML, régler ces foutus problèmes d'encodage, et surtout me retaper les 23000 lignes de code de mon appli... ).
    En tout cas merci pour l'aide. Même si j'ai pas tout compris, ça m'a permis d'avancer...

  6. #26
    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 : 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
    Par défaut
    Citation Envoyé par arkhamon1 Voir le message
    Merci pour les infos.
    Du coup, entre temps, j'ai réfléchi et en fait j'ai contourné la difficulté en transmettant le répertoire où se situent mes données en paramètres et en récupérant args[0]
    En général, pour éviter de convonfre avec les argument, il arrive qu'on fasse ce genre de chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -DAPPLICATION_HOME=xxxx <reste des paramètres>

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.getProperty("APPLICATION_HOME");
    je l'ai pas évoqué car, pour la distribution, ca nécessite de passer par un installeur qui créera les .bat / .sh en y injectant le répertoire d'installation choisi par l'utilisateur.


    Pour les ressources, je recommande d'y jeter un oeil assez vite. Car une fois la machine en marche, c'est du boulot de remplacer tous les File par des getResouce

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    En java, pour tout ce qui viens avec l'application, on utilise des resources, qui apparaissent sous forme d'url et non pas des File, qui nécessitent un emplacement précis sur le filesystem. A noter que ce n'est pas propre à java, le problème à résoudre est le même pour tous les language. Mais java, via les ressource, fournis une solution facile d'emploi.
    On les utilise comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL imageURL = getClass().getResource("/images/backgrond.png");
    Quand vous marquez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL imageURL = getClass().getResource("/images/backgrond.png");
    le "/images/background.png" est censé se situer où exactement ? dans un sous dossier de ..../bin, ou dans un de l'appli ? C'est là ou j'ai un peu de mal... En fait ce que je comprends pas c'est pourquoi le getResource trouverait plus facilement le fichier...


    Citation Envoyé par tchize_ Voir le message
    Ensuite, ce que vous devez faire pour la distribution:

    empaqueter toutes vos classes et vos images & autres dans un .jar (voir les FAQ java pour savoir comment faire)
    mettre toutes les librairies éventuelles dont vous auriez besoin dans un sous dossier à coté du jar (exemple lib/)
    dans votre jar, vous aurez un fichier META-INF/MANIFEST.MF qui référencera votre main (à exécuter) et le Classpath (librairies dont l'emplacement est relatif à ce jar).
    Vous aurez donc ce genre de structure portable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    application.jar
    lib/
       librairie1.jar
       librairie2.jar
       librairie3.jar
    que vous pourrez, par exemple zipper.


    Bref, la bonne pratique c'est d'éviter d'utiliser File pour tout ce qui est supposé embarqué avec l'application. Par contre on utilise File pour tout ce qui est spécifique à l'utiliser (la config qu'on stocke dans user.home, les fichiers ouvert via une boite de dialogue, etc)
    Du coup le fameux .jar va contenir toute l'appli c'est ça ? Du coup si je veux juste livrer un fichier .class que je viens de modifier, je dois relivrer le jar complet ?

  8. #28
    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 : 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
    Par défaut
    Citation Envoyé par arkhamon1 Voir le message
    Quand vous marquez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL imageURL = getClass().getResource("/images/backgrond.png");
    le "/images/background.png" est censé se situer où exactement ? dans un sous dossier de ..../bin, ou dans un de l'appli ? C'est là ou j'ai un peu de mal... En fait ce que je comprends pas c'est pourquoi le getResource trouverait plus facilement le fichier...
    Dans le classpath. Donc, par exemple, dans le même jar. Sous eclipse, vous pouvez par exemple créer une répertoire ressource. Puis bouton droit -> add to build path. ainsi si vous avez un fichier ressource/images/background.png, il aura le nom "/images/background.png" dans le classpath.


    Du coup le fameux .jar va contenir toute l'appli c'est ça ? Du coup si je veux juste livrer un fichier .class que je viens de modifier, je dois relivrer le jar complet ?
    Oui, en même temps, c'est plus propre de livre le jar complet que de livrer des .class individuel et prier que la personne de l'autre coté les places au bon endroit . Une application c'est en général beaucoup de classes, traiter leur mise à jour individuelle, c'est suicidaire

  9. #29
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Si je ne trompe pas, tu définis un chemin relatif pour trouver ton fichier xml.

    Si c'est bien le cas, cela explique la différence entre une exécution par Eclipse, et une exécution en ligne de commande.

    La particularité d'Eclipse, c'est que le répertoire racine est celui du projet. Par exemple /home/user/workspace/monprojet. Ce répertoire contient les dossiers bin et src dans lesquels se trouvent les sources et les fichiers compilés.

    Alors qu'en ligne de commande, le répertoire racine est celui qui contient les fichiers .class. Par exemple /home/user/workspace/monprojet/bin

    Donc, si tu définis un chemin relatif, celui-ci ne pointera pas sur le même chemin absolu sous Eclipse et en ligne de commande.

    C'est un peu con il faut bien l'avouer, c'est pour ça qu'il est préférable de placer ses fichiers statiques dans le classpath et les récupérer comme l'indique tchize.

    [EDIT] Je n'avais pas vu qu'il y avait une deuxième page sur ce topic, donc mon message est un peu hors de propos [/EDIT]

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Par défaut
    Rassures toi, ta réponse me donne l'explication de ce que je comprenais sans maitriser : la différence du chemin de base.
    Donc sans savoir comment régler ce problème, je l'ai contourné en utilisant un paramètre transmis sur la ligne de commande.
    Merci quand même.

  11. #31
    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 : 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
    Par défaut
    Citation Envoyé par verbose Voir le message

    Alors qu'en ligne de commande, le répertoire racine est celui qui contient les fichiers .class. Par exemple /home/user/workspace/monprojet/bin
    pas nécesssairement, comme déjà dit, c'est pas prévisible pour l'application

  12. #32
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pas nécesssairement, comme déjà dit, c'est pas prévisible pour l'application
    Effectivement, le chemin exact n'est pas prévisible et dépend du répertoire d'installation de l'application. Mais d'une manière générale, le répertoire pointé par un chemin relatif dépend du répertoire qui contient les fichiers .class, ou le .jar. Après, ces fichiers .class et ce jar peuvent se situer n'importe où dans le système de fichier.

  13. #33
    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 : 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
    Par défaut
    Citation Envoyé par verbose Voir le message
    d'une manière générale, le répertoire pointé par un chemin relatif dépend du répertoire qui contient les fichiers .class, ou le .jar.

    Non justement. Ca dépend uniquement du répertoire courant au moment où je lance l'application (bref le dernier "cd" que j'ai effectué)

    Si de tappe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd c:\
    java -cp "c:\Mes documents\monApplication\bin"  mon.Application
    Les chemins relatifs se feront par rapport à c:\ et non pas par rapport à c:\Mes documents\monApplication\bin.

  14. #34
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Ah oui effectivement

    Bien vu

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Passer les certifications java sans se ruiner.
    Par Turtle dans le forum Certifications
    Réponses: 7
    Dernier message: 21/03/2005, 09h21
  2. [SAX] Passer d'objet java en fichier XML?
    Par spoutyoyo dans le forum Format d'échange (XML, JSON...)
    Réponses: 15
    Dernier message: 05/01/2005, 08h31
  3. Comment passer sous Delphi ?
    Par J-P-B dans le forum XMLRAD
    Réponses: 2
    Dernier message: 13/06/2003, 10h09

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