VRMLworks

Réponses de la FAQ comp.lang.vrml
3. Problèmes avec Java

  1. Où trouve-t-on les classes VRML pour Java?

    L'installation de la plupart des navigateurs VRML installera automatiquement les classes VRML Java. Voici quelques installations par défaut que je connais:

    Windows 95/Netscape Navigator et Communicator

    Cosmo Player 2.1 C:\Program Files\Netscape\Navigator\Program\Plugins\Npcosmop21.zip
    C:\Program Files\Netscape\Communicator\Program\Plugins\Npcosmop21.jar
    WorldView 2.0 C:\Program Files\WorldView for Netscape Navigator\classes
    Community Place C:\Program Files\Community Place Browser\lib\java\vsclass.zip
    CCPro C:\Program Files\Blaxxun Interactive\CCPro\Java\classes

    Unix

    Cosmo Player 1.02
    (IRIX)
    /usr/CosmoPlayer/classes/vrml
    Il est quelquefois nécessaire de copier ce dossier à ~/.netscape/plugins/classes/vrml

    Quelqu'un connaît-il l'endroit où trouver les classes Java dans d'autres navigateurs? D'autres plateformes?

  2. Je ne réussis pas à faire fonctionner Java dans un Script.

    Premièrement, assurez-vous que votre navigateur VRML supporte Java dans le nœud Script. Cosmo Player, Community Place, et WorldView sont parmi les navigateurs reconnus comme supportant pleinement Java dans les Scripts.

    Il y a deux classes de navigateur VRML sur les machines Windows 95 et NT: l'un modifie le fichier autoexec.bat en ajoutant les classes VRML à votre variable d'environnement CLASSPATH. L'autre tire parti d'un raccourci dans Netscape Navigator et Communicator permettant au "plugin" de chercher pour un fichier .zip ou .jar dans le dossier "plugins" de Netscape. Les premiers sont plus susceptibles de connaître des problèmes occasionnés par la variable CLASSPATH. WorldView et Community Place modifient autoexec.bat et Cosmo Player utilise le dossier "plugins".

    Si vous avez WorldView ou Community Place suivez cette procédure intelligemment définie par Jeff Harrington:

    D'abord, tapez ceci dans une fenêtre DOS:

    set CLASSPATH=c:\java\vrml

    Ou le chemin où vos classes Java sont installées. Maintenant, de la même fenêtre DOS, testez en démarrant Netscape à partir de l'invite de commande DOS:

    CD \
    CD "Program Files\Netscape\Navigator\Program"

    et tapez:

    Netscape

    SI ça marche, alors c'est que tout fonctionne à merveille. Ajoutez une instruction à votre autoexec.bat comme celle-ci:

    set CLASSPATH=c:\java\vrml;%CLASSPATH%

    SI ça ne fonctionne pas, essayez avec un autre nom de chemin. Votre problème est cependant identifié: CLASSPATH n'est pas correctement assigné pour dire à Netscape où regarder pour les classes Java externes.

    Non seulement vous pouvez éprouver des problèmes en n'ayant pas suffisamment de classes dans votre CLASSPATH, vous pouvez aussi en avoir si vous en avez trop. La façon de faire la plus sûre est de repartir à zéro (rien dans CLASSPATH), lisez les messages d'erreurs, et ajoutez les classes jusqu'à ce que ça fonctionne.

    J'ajouterai ici un avis de Justin Couch: il y a quelques problèmes récurants avec Java (les Script Java fonctionnent bien, mais pas l'EAI) qui ne peuvent être résolus qu'en désinstallant Netscape et tous ses "plugins", le réinstaller ensuite dans un dossier avec un nom différent, et réinstaller votre "plugin" VRML.

    Un autre problème survient lorsque vous avez plusieurs navigateurs VRML acceptant  les scripts Java. Il y a une page à "VRMLworks" traitant des problèmes avec plusieurs plugins.

  3. Mon compilateur Java dit que "vrml.*" et les autres classes VRML sont inconnues.

    Votre compilateur Java ne sait pas où se trouve vos classes VRML. Si vous utilisez javac, le compilateur à ligne de commande dans le Sun's Java Development Kit (JDK), vous aurez besoin de définir votre variable d'environnement CLASSPATH. D'autres compilateurs ou environnements de programmation Java pourront utiliser d’autres conventions pour établir un chemin de recherche, mais ce qui suit pourra s'appliquer avec quelques modifications à votre système. La situation se complique un peu plus avec le JDK 1.0x de Sun qui ne reconnaît pas toujours les classes contenues dans un fichier zip. Et encore d'autres complications surviennent de l'emploi de certains compilateurs parce qu'ils utilisent DEVCLASSPATH au lieu de CLASSPATH.

    Voici une solution avec javac sur Windows 95 qui a fonctionné pour moi:

    1. "Dézippez" vos classes VRML dans un nouveau dossier. Voir la réponse à une autre question pour savoir où les trouver. Pour notre exemple, nous dirons qu'elles sont dans C:\Java\Classes. Les versions de WinZip plus récentes reconnaissent les fichiers jar, mais si vous possédez une version plus vielle, vous pouvez simplement ajouter jar au type de fichiers pouvant être ouvert par WinZip.

    2. Ouvrez une fenêtre de session DOS et changez de dossier de travail en allant au dossier contenant le code Java que vous voulez compiler.

    3. Tapez ce qui suit pour ajouter les classes VRML et votre dossier de travail actuel à votre CLASSPATH:
      SET CLASSPATH=C:\Java\Classes\;.;%CLASSPATH%

      Vous pourriez devoir utiliser DEVCLASSPATH selon vos outils.

    4. Compilez votre fichier:
      JAVAC foo.java
      

    Faites la même chose sur les systèmes Unix, à l’exception que vous changerez les variables d'environnement de la façon habituelle dans votre shell:

    	# set CLASSPATH=/usr/local/java/whatever
    	# export CLASSPATH
    	% setenv CLASSPATH /usr/local/java/whatever

    Si ça fonctionne, et vous pourriez devoir expérimenter un peu pour définir correctement CLASSPATH, ajoutez la ligne que vous avez tapée à l'étape 3 ci-dessus, soit dans autoexec.bat ou dans le fichier d'initialisation ou la liste de préférences de votre compilateur Java. Don Brutzman nous fournit quelques informations supplémentaires sur la configuration pour la compilation et l'exécution de code Java à la Naval Postgraduate School.

  4. Lorsque j'exécute un Script Java, j'obtiens un NullPointerException.

    Tout d'abord, regardez à votre console Java, si votre navigateur web en a une. Déterminez ce que le Java Virtual Machine (JVM) ou le Java runtime vous dit qu'il vous manque. Si la classe ou objet qu'il ne peut trouver sont réellement là, il y a deux explications possibles:

    1. Les planètes sont mal alignées ou vous êtes victime du rayonnement cosmique fossile. Pressez le bouton Recharger (majuscule-Recharger commandera à Netscape  quelque chose comme "Non, pas de farce, je veut vraiment recharger") et essayez encore.

    2. Quelque chose d'important n'a pas encore été chargé. Ce qui suit est la Seule Vraie Façon d'initialiser. Ne jamais, jamais assumer que le navigateur ou n'importe lequel des nœuds de votre scène a été chargé. Utilisez ce code de Justin Couch:

      for(int i = 0; i<SOME_NUMBER; i++)
      {
           Browser b = Browser.getBrowser();
      
           if(b ==  null)
               sleep(SOME_TIME_VALUE)
           else
               break;
      }

      J'ai vu beaucoup de gens utiliser 5 pour SOME_NUMBER et 500 pour SOME_TIME_VALUE. D'autres font comme suit:

      for(int i = 0; i<SOME_NUMBER; i++)
      {
           Browser b = Browser.getBrowser();
      
           if(b !=  null)
               break;
      
           try {
               Thread.sleep(SOME_TIME_VALUE);
           }
           catch(InterruptedException e)
           {  // action bidon
           }
      }

      Justin note que vous pouvez avoir besoin de répéter cette procédure avec getNode(). Et j'ajouterai que toutes les fois que vous obtenez des "null pointers" qui semblent vous dire que l'objet n'est pas encore là, utilisez les exemples ci-dessus pour vous dépanner. J'ai découvert aussi que de déplacer l'initialisation de pointeurs en dehors de la méthode initialize() vers la fonction qui est appelée par le script donnera de bon résultats, particulièrement si le script dépend d'une action provoquée par l'usager,  et à ce moment on peut assumer de façon sûre que le monde a été chargé.

    Justin Couch a découvert qu'un différent NullPointerException peut se produire avec Netscape Communicator avec la correction ("patch") AWT installée. Il semble que ce soit un bug dans Communicator,  et la façon de le contourner est d'enlever toutes références aux classes Netscape dans le CLASSPATH.

  5. Je n'arrive pas à faire fonctionner EAI sur mon navigateur.

    Assurez-vous d'abord que c'est EAI qui ne fonctionne pas et non votre code. Les exemples dans les spécifications de travail de l'EAI de Chris Marrin devraient tous fonctionner. Si quelques-uns fonctionnent alors que d'autres ne fonctionnent pas, c'est que votre navigateur ne supporte pas correctement toutes les classes de l'EAI. Le EAI FAQ de Ross Finlayson possède nombre d'indices pour vous aider à faire fonctionner l'EAI sur votre machine. Et des  Exemples VRML de Michael Paulitsch montrent nombres de techniques pour Java Script et l'EAI, quoiqu'il serait sage d'utiliser la technique mentionnée dans la question précédente si vous rencontrez des erreurs de "NullPointerExceptions".

    Un nouveau symptôme a vu le jour avec le lancement de la version 2.1 de Cosmo Player. Le message d’erreur est "netscape.javascript.JSException: unable to reflect embed with index 0 - not loaded yet?" Auparavant, vous pouviez avoir les classes Java d'autres navigateurs dans votre CLASSPATH et Cosmo Player les aurais ignorées. Ce n'est plus le cas, et il faut vous en débarrasser. La façon la plus simple est de renommer le fichier ou le dossier. Par exemple, C:\Java\classes\current.zip est dans mon CLASSPATH; je le renomme foo.zip. Ensuite quand je veux utiliser l'autre navigateur, je rétablis le nom à current.zip.


[line]

Ai-je oublié quelque chose qui vous serait utile dans ces questions? Si c'est le cas, faite-le moi savoir.

-- Bob Crispen
-- Samedi, 4 mars, 2000

Notes du traducteur:
Si vous avez des suggestions, corrections ou commentaires à apporter,
n'hésitez pas à me contacter

-- Sylvain Carette
-- Dimanche, 17 juin 2001