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

JWS Java Discussion :

FileInputStream référençant un fichier dans le Jar actif -> FileNotFound


Sujet :

JWS Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut FileInputStream référençant un fichier dans le Jar actif -> FileNotFound
    Bonjour,

    Mon application utilisait FileInputStream pour ouvrir des fichiers et celà a toujours fonctionné y compris quand je la lançais à partir d'un jar. Le truc c'est que je plaçais le jar dans le même répertoire que l'arborescence décompressée...

    En voulant migrer mon application vers Java Web Start, je me suis rendu compte que les fichiers ne s'ouvraient plus et je récupère une exception FileNotFound pour charger un fichier de path: com/inpoculis/plugins/common/mahjongPluginInfo.xml

    Biensur ce fichier est dans mon archive jar principale.

    Quelqu'un peut il m'aider ?

    Merci d'avance,
    Bernard.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Utilise plutot class.getClassLoader().getResourceAsStream(), ça marche dans tous les cas dès que la ressource est dans le classpath

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Nickel, reste à charger les données
    Merci pour le getResourceAsStream.

    Reste que j'ai un répertoire "data" au même niveau que mon jar dans lequel j'ai des textures à charger et que rien ne semble fonctionner. Même en utilisant l'adresse complète de mon fichier je n'y arrive pas, ex:
    [ http://127.0.0.1:8080/inpoculis/data/gfx/monfichier.gif ]
    [ http://127.0.0.1:8080/inpoculis/Mahjong.jar ]

    Une solution ?

  4. #4
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Toute combine pour retrouver un fichier à partir de la position d'un jar est vouée à l'échec tôt ou tard !

    Tu peux retrouver un fichier DANS le jar (et à ce moment là tu ne sais même pas qu'il est dans un jar), mais il est vain de vouloir spéculer sur la position de ce jar quelque part.

    Vois le jar comme quelque chose dont tu ignores l'aspect extérieur, dont tu ne sais même pas qu'il existe, mais dont tu peux accéder à l'intérieur, par la notion de ressource (getClass().getResource() ou autre).

    Vois les fichiers comme quelque chose que tu peux accéder par la notion de... fichier (File).

    Pour ton méli-mélo précis, diverses hypothèses explicatives peuvent être envisagées :

    - tu n'as tout simplement pas la permission d'accés à ton disque local depuis Java Web Start -> il faut signer les jar

    - ou bien c'est tellement le pataques entre ton arborescence de fichiers, ton arborescence serveur http, que plus rien ne correspond à plus rien -> tout effacer et tout recommencer au calme.

    - ou bien ton serveur http n'est même pas lancé

    - il n'y a aucune raison sérieuse pour que tu externalises l'image, et ton PC se révolte.

    - Java Web Start a recopié les jars dans un cache à lui, et leur situation exacte n'a plus rien à voir avec la situation où tu les as mis. (ils n'ont même plus le même nom, d'ailleurs, si mes souvenirs sont exacts du fonctionnement de JWS).

    - etc.

    Bon courage tout de même !

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Il y a quand même des raisons pour externaliser les ressources :)
    > tu n'as tout simplement pas la permission d'accés à ton disque
    > local depuis Java Web Start -> il faut signer les jar
    Ils sont signés mais j'ai un avertissement comme quoi ils sont invalides. J'accepte le contrat en notant que: "Cette application s'exécutera sans les restrictions de sécurités généralement fournies par Java"

    > ou bien c'est tellement le pataques entre ton arborescence de fichiers,
    > ton arborescence serveur http, que plus rien ne correspond à plus rien
    > -> tout effacer et tout recommencer au calme.
    Je suis en train de porter mon application pour JWS donc j'ai installé tomcat et j'ai copié mes fichiers dans un répertoire : webapps/root/mahjong

    > ou bien ton serveur http n'est même pas lancé
    Je commence par charger une image proxy pour le cas où des fichiers n'existent pas ( ça foire dès ce fichier biensûr ), l'adresse est: "http://127.0.0.1:8080/mahjong/data/gfx/divers/errorLoadingImage.gif"
    Quand je rentre cette adresse dans mon browser, l'image s'affiche.

    > il n'y a aucune raison sérieuse pour que tu externalises l'image, et ton
    > PC se révolte.
    Hehe, l'intérêt c'est que le graphiste ( du moins quand j'en aurai un nouveau car le miens n'a rien foutu depuis début mai ) peut modifier les fichiers sans avoir à repackager l'application. De plus j'aimerais pouvoir charger des pages webs situées je ne sais où... Maintenant si c'est pas possible, pour la version JWS, en effet je tenterai de tout mettre dans le même jar... A bien y réfléchir si je ne fais pas ça, entre les textures et les sons ça va pas être la peine, 150 fichiers téléchargés individuellement ça va bien puer Judicieuse remarque donc.

    > Java Web Start a recopié les jars dans un cache à lui, et leur situation
    > exacte n'a plus rien à voir avec la situation où tu les as mis. (ils n'ont
    > même plus le même nom, d'ailleurs, si mes souvenirs sont exacts du
    > fonctionnement de JWS).
    Le Jar et les libs sont dans un cache mais pas mon répertoire "data", JWS l'ignore mais il devrait quand l'ouvrir si je lui passe l'url complète que je peux utiliser dans mon browser web, non ? ( http://127.0.0.1:80/... )

    Merci pour les conseils, si je trouve la solution, j'expliquerai mon erreur.

  6. #6
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Citation Envoyé par nanar77
    > il n'y a aucune raison sérieuse pour que tu externalises l'image, et ton
    > PC se révolte.
    Hehe, l'intérêt c'est que le graphiste ( du moins quand j'en aurai un nouveau car le miens n'a rien foutu depuis début mai ) peut modifier les fichiers sans avoir à repackager l'application. De plus j'aimerais pouvoir charger des pages webs situées je ne sais où... Maintenant si c'est pas possible, pour la version JWS, en effet je tenterai de tout mettre dans le même jar... A bien y réfléchir si je ne fais pas ça, entre les textures et les sons ça va pas être la peine, 150 fichiers téléchargés individuellement ça va bien puer Judicieuse remarque donc.
    Ah je vois mieux ce qui te fait souci, alors !

    Pourquoi ne mettrais-tu pas ces images dans un jar spécial, différent de celui de ton application ? Depuis ton fichier JNLP de Java Web Start, tu le mettrais dans la liste des ressources. Tes graphistes feraient leur .jar, et tu ferais autant de JNLP que de graphistes.

    Il existe aussi une combine avec Java Web Start qui peut peut être t'aider : celle des extensions.

    Les extensions sont d'autres fichiers jnlp (Java Web Start), que l'application utilise comme bibliothèque ; cela donne de la modularité à ton application.

    Pour des raisons qui m'échappent je ne suis pas parvenu à le retrouver dans la doc !? (c'est la fin de semaine, sans doute). Pour les extensions c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            <resources>
                    <j2se version="1.5+"/>
                    <jar href="appli.jar"/>
                    <extension
                            name="composants graphiques"
                            href="graphiques.jnlp"/>
            </resources>
    Enfin, si tu préfères avoir ces images ailleurs que dans un jar, alors il ne faut pas utiliser de getResource : ce ne sont plus des ressources. Il faut simplement y accéder par l'accés aux url. Il faut utiliser le inputStream de lecture de cette url. Cette méthode est sans doute la plus souple, puisqu'elle te permet de changer de graphiste sans avoir à changer de JNLP, encore mieux que le CPE !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Resources à partir d'un jar externe: même class loader ?
    Je vais conserver l'idée du package des ressources. Pour l'instant je pense avoir tout fait convenablement:

    jnlp principal:
    <resources>
    <j2se version="1.5.0+" />
    <jar href="Mahjong.jar" />
    <jar href="lib/basicplayer2.3.jar" />
    <jar href="lib/commons-logging-api.jar" />
    <jar href="lib/gnujaxp.jar" />
    <jar href="lib/jcommon-1.0.0.jar" />
    <jar href="lib/jfreechart-1.0.1.jar" />
    <jar href="lib/mp3spi1.9.4.jar" />
    <jar href="lib/ostermillerutils_1_06_00.jar" />
    <jar href="lib/swing-layout-1.0.jar" />
    <jar href="lib/tritonus_share.jar" />
    <jar href="lib/vecmath.jar" />
    <jar href="lib/vorbisspi1.0.jar" />
    <jar href="lib/jl1.0.jar" />
    <jar href="lib/jogg-0.0.5.jar" />
    <jar href="lib/jorbis-0.0.12.jar" />
    <extension name="JOGL" href="jogl.jnlp"/>
    <extension name="DATA" href="data.jnlp"/>
    </resources>

    jnlp pour les data:
    <jnlp spec="1.0+" codebase="http://127.0.0.1:8080/mahjong/" href="data.jnlp">
    <information>
    <title>Data</title>
    <vendor>Bernard</vendor>
    <homepage href="http://www.in-poculis.com" />
    <description>Datas for in-poculis games.</description>
    <offline-allowed />
    </information>
    <resources>
    <j2se version="1.5.0+" />
    <jar href="lib/data.jar" />
    </resources>
    <security>
    <all-permissions />
    </security>
    <component-desc />
    </jnlp>

    Mon fichier data.jar ne contient aucune classe, je l'ai compressé en jar puis je l'ai signé, j'ai donc un manifest basique:

    Manifest-Version: 1.0
    Created-By: 1.5.0_06 (Sun Microsystems Inc.)

    Name: data/md2/tileNeutralFull01.md2
    SHA1-Digest: Hlp1V+jnYEuyBsrEFft5zsp5ktI=

    Name: data/gfx/icons/bigicons/iconeReplay.jpg
    SHA1-Digest: JBF8FtfHADPC1fDB6icx1IljbWk=
    ...


    Mais il y a un problème, je n'arrive toujours pas à accéder aux ressources.
    J'ai essayé une classe de Mahjong.jar pour obtenir un classLoader puis appeller getResource( ... ) mais ça ne fontionne pas. Alors j'ai tenté un getSystemClassLoader en espérant que ça soit un loader de haut niveau capable de trouver une donnée dans n'importe quel .jar du JNLP principal mais toujours pas.

    Encore une idée ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Ca fonctionne
    Une partie du code fonctionne. Maintenant je vais devoir aller dans chaque fichier faisant appel à InputStream ou autre pour faire des modifications.

    Pour charger une donnée située dans un Jar autre que le Jar principal:
    Thread.currentThread().getContextClassLoader().getResource("data/xx/sprite01.jpg");

    Merci beaucoup pour le coup de main
    ++

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/11/2006, 12h38
  2. inclure des fichiers dans un .jar
    Par cysboy dans le forum Multimédia
    Réponses: 3
    Dernier message: 11/09/2006, 14h56
  3. [JAR]Modification de fichier dans un jar
    Par vberetti dans le forum Général Java
    Réponses: 14
    Dernier message: 13/06/2005, 18h56
  4. [JAR] lire un fichier dans un jar OU hors d'un jar
    Par yveslamand dans le forum Général Java
    Réponses: 13
    Dernier message: 25/04/2005, 15h38
  5. [JAR] Accéder à un fichier dans un jar
    Par Nanoua dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 06/07/2004, 14h00

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