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.
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 ?
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.
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 ?