Bonjour à tous,
Je rencontre actuellement un problème que je n'arrive pas à comprendre, c'est pourquoi je tente ma chance sur ce forum.
Tout se déroule sous NetBeans 6.5 avec le jdk 1.6.
Le contexte est simple. Il s'agit d'un jar exécutable qui contient en plus de ses classes de travail un dossier nommé HTMLFiles, qui comme son nom l'indique contient des fichiers HTML, dont un fichier qui se nomme index.html.
Dans son travail, mon jar est amené à ouvrir un fichier contenu dans ce dossier HTMLFiles.
Pour réaliser cette opération, j'avais dans un premier temps utilisé la méthode getRessource de mon ClassLoader pour récupérer sous la forme d'un File ma ressource index.html. Et là, surprise ! Le code fonctionne parfaitement lorsque je l'exécute sous NetBeans, mais si je le lance en dehors de NetBeans, je constate que la construction du fichier échoue car la ressource n'est plus trouvée ?!
J'en ai alors conclu que le ClassLoader n'utilise pas le même path lorsqu'il évolue dans une JVM instanciée par NetBeans que celui utilisé par la JVM lorsque le code est lancé en dehors de NetBeans. Après avoir pisté la chose, je me suis éffectivement rendu compte que dans NetBeans, le fichier est cherché dans le code source, pas dans le dossier dist résultant de la compilation. Je me suis dit que cela venait du fait d'exploiter un objet File, qui par définition est en rapport avec le système de fichier, hors mon fichier se trouve à l'interieur de mon jar, donc pas sur le système de fichier.
J'ai alors changé de technique et j'ai remplacé mon File par un InputStream via la méthode getRessourceAsStream de mon ClassLoader. InputStream étant plus généraliste que File, il n'est pas forcément associé au système de fichier. Effectivement, une fois la modification apportée, mon code fonctionne. Enfin presque....
Je penses que vous avez devinez que je m'amusais à construire un serveur Web en quelque sorte. C'est éffectivement presque le cas.
Pour clarifié la chose, mon code écoute le port 80 avec un serversocket. Je pars du principe que mon programme sera sollicité par le protocole HTTP. J'ai donc étudié ce dernier et j'ai compris qu'il y a avait en gros deux mode de transfert de fichier, pour simplifier. Un mode texte, et un mode binaire. J'ai aussi remarqué que les navigateurs Web lorsqu'ils interrogent un serveur Web via HTTP soumettent une requête HTTP généralement pour demander une page html. Et tout de suite après avoir récupéré la page, les navigateurs envoient une requête supplémentaire automatiquement pour récupérer l'icône du site visité. Cette requête demande l'envoie d'un fichier sensé se trouver à la raçine du site et se nommé favicon.ico.
J'ai alors ajouté dans mon dossier HTMLFiles, un fichier favicon.ico à côté du fichier index.html.
Comme mon programme répond correctement à la requête de la page HTML, trouve le fichier via mon ClassLoader (dans NetBeans ou Hors NetBeans), et comme il sait répondre à plusieurs requêtes successives, j'ai été fier de moi de remarquer que cela fonctionne à merveille. Du moins lorsque je lance le code depuis NetBeans.
En effet, depuis NetBeans, lorsque j'interroge mon programme avec mon navigateur web, je récupère bien ma page index.html, et je vois l'icône correspondant au fichier favicon.ico que j'ai ajouté dans HTMLFiles apparaît devant l'URL dans la barre d'adresse et devant le nom de l'onglet de la page. Pour bien comprendre la suite, je précise que cette icône représente un bonhomme qui cours juste vêtu d'un short, les cheveux au vent.
C'est maintenant que cela devient étrange car comme je viens de le dire, en lançant le code depuis NetBeans, tout fonctionne parfaitement bien. Mais dés que je le lance hors NetBeans, je n'ai aucunes erreurs, mais mon icône n'apparaît pas entière ???? on ne voit que les pieds de mon coureur ???
Je récapitule :
- Lancement depuis NetBeans, favicon.ico apparaît entier dans l'onglet et devant l'URL.
- Lancement en dehors de NetBeans, favicon.ico apparaît partiellement ?!...
Quelqu'un aurait-il une idée ?
Si cela est nécessaire, je peux montrer mon code....
Partager